我被困了几个小时,我无法解决这个问题。
以下代码运行良好,但重定向时仅部分显示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),
我该如何解决这个问题?
答案 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
功能。