Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django SlugField部分显示_Python_Django - Fatal编程技术网

Python Django SlugField部分显示

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

我被困了几个小时,解决不了这个问题

下面的代码运行良好,但重定向时仅部分显示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(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