Python Django SlugField部分显示
我被困了几个小时,解决不了这个问题 下面的代码运行良好,但重定向时仅部分显示Url 例如,当slugfield为blah-1时,url显示为/blah/(不带-1) 型号:Python Django SlugField部分显示,python,django,Python,Django,我被困了几个小时,解决不了这个问题 下面的代码运行良好,但重定向时仅部分显示Url 例如,当slugfield为blah-1时,url显示为/blah/(不带-1) 型号: class Post(models.Model): title = models.CharField(max_length=120) slug = models.SlugField(unique=True, allow_unicode=True) image = models.ImageField(n
class Post(models.Model):
title = models.CharField(max_length=120)
slug = models.SlugField(unique=True, allow_unicode=True)
image = models.ImageField(null=True, blank=True,
width_field="width_field",
height_field="height_field")
height_field = models.IntegerField(default=0)
width_field = models.IntegerField(default=0)
content = models.TextField()
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
hit_count = models.IntegerField(default=0)
class Meta:
ordering = ['-timestamp']
def __unicode__(self):
return self.title
@property
def is_past_due(self):
from datetime import date
if date.today() == self.timestamp.date():
return True
return False
def get_unique_slug(self):
slug = slugify(self.title, allow_unicode=True)
unique_slug = slug
counter = 1
while Post.objects.filter(slug=unique_slug).exists():
unique_slug = '{}-{}'.format(slug, counter)
counter += 1
return unique_slug
def save(self, *args, **kwargs):
self.slug = self.get_unique_slug()
return super(Post, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse("posts:detail", kwargs={"slug": self.slug})
视图:
网址:
urlpatterns=[
url(r'^$',views.post_list,name=“list”),
url(r“^create/$”,视图。post_create),
url(r'^(?P[\w-]+)/$',views.post_detail,name='detail'),
url(r'^(?P[\w-]+)/edit/$',views.post_update,name='update'),
url(r'^(?P[\w-]+)/delete/$,views.post_delete),
如何解决此问题?尚未测试此代码,但它现在应该可以工作了:
def get_unique_slug(self):
slug = slugify(self.title, allow_unicode=True)
unique_slug = '{}-1'.format(slug)
counter = 1
while Post.objects.filter(slug=unique_slug).exists():
unique_slug = '{}-{}'.format(slug, counter)
counter += 1
return unique_slug
问题是,当您创建新的post时,函数的while块不会执行,因为当一个slug已经是唯一的时,while语句为false。这意味着唯一slug始终是您的原始slug(末尾没有附加数字)
测试这一点的一种方法是在while块中放入一个print语句。创建一个新的唯一slug,您将看到print语句没有执行
在上面的代码中,我们修改了代码,以便首先为unique_slug分配-1
后缀
旁注:
这段代码的效率有点低(如果你有400篇文章叫做废话,你将对数据库进行400次重击)。使用url结构(如
/
)不是更好吗?通过使用id和slug作为标识符,可以保证每篇文章的唯一性。您可以完全删除get\u unique\u slug
功能。尚未测试此代码,但现在应该可以工作了:
def get_unique_slug(self):
slug = slugify(self.title, allow_unicode=True)
unique_slug = '{}-1'.format(slug)
counter = 1
while Post.objects.filter(slug=unique_slug).exists():
unique_slug = '{}-{}'.format(slug, counter)
counter += 1
return unique_slug
问题是,当您创建新的post时,函数的while块不会执行,因为当一个slug已经是唯一的时,while语句为false。这意味着唯一slug始终是您的原始slug(末尾没有附加数字)
测试这一点的一种方法是在while块中放入一个print语句。创建一个新的唯一slug,您将看到print语句没有执行
在上面的代码中,我们修改了代码,以便首先为unique_slug分配-1
后缀
旁注:
这段代码的效率有点低(如果你有400篇文章叫做废话,你将对数据库进行400次重击)。使用url结构(如/
)不是更好吗?通过使用id和slug作为标识符,可以保证每篇文章的唯一性。您可以完全删除获取唯一性slug
功能。可能?可能?
def get_unique_slug(self):
slug = slugify(self.title, allow_unicode=True)
unique_slug = '{}-1'.format(slug)
counter = 1
while Post.objects.filter(slug=unique_slug).exists():
unique_slug = '{}-{}'.format(slug, counter)
counter += 1
return unique_slug