Django SlugField部分显示

时间:2017-06-10 23:21:18

标签: python django

我被困了几个小时,我无法解决这个问题。

以下代码运行良好,但重定向时仅部分显示Url。

例如,当Slugfiled为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})

查看:

def post_create(request):
    form = PostForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.save()
        messages.success(request, "succes.")
               #This redirecting is the problem
        return HttpResponseRedirect(instance.get_absolute_url())

    context = {
        "form": form,
    }
    return render(request, "blog/post_form.html", context)

URL:

urlpatterns = [
url(r'^$', views.post_list, name="list"),
url(r'^create/$', views.post_create),
url(r'^(?P<slug>[\w-]+)/$', views.post_detail, name='detail'),
url(r'^(?P<slug>[\w-]+)/edit/$', views.post_update, name='update'),
url(r'^(?P<slug>[\w-]+)/delete/$', views.post_delete),

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

尚未测试此代码但现在应该可以使用:

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

问题是当你创建一个新帖子时,你的函数的while块没有被执行,因为当slug已经是唯一的时,while语句是false。这意味着唯一的slug总是你的原始slug(没有附加到末尾的数字)。

测试此方法的一种方法是在while块中放置一个print语句。创建一个新的唯一slug,你会看到print语句没有被执行。

在上面的代码中,我们更改代码,以便首先使用-1后缀分配unique_slug。

<强>旁注: 这段代码效率有点低(如果你有400个帖子叫做blah,那么你的数据库将被敲打400次)。使用<id>/<slug>等网址结构会不会更好。通过使用id和slug作为您的标识符,您将确保每个帖子的唯一性。您可以完全删除get_unique_slug功能。