我正在我的博客项目中学习django但是我的网址无法正常工作当我创建帖子时,我的帖子创建成功并保存在数据库中,我可以在博客中看到我的明信片,但是当我单击该明信片以查看显示该错误的帖子时,出现此错误
找不到页面(404)请求方法:GET要求网址:http://127.0.0.1:8000/blog/post/2019/10/5/testing-urls-design/提出者:Blog.views.post
这是我的博客应用程序模型的一部分:
models.py
class Post(models.Model):
image = models.ImageField(upload_to='Posts_image')
title = models.CharField(max_length=256)
slug = models.SlugField(max_length=256,null=True,blank=True)
content = HTMLField('Content')
date = models.DateTimeField(auto_now_add=True)
categories = models.ManyToManyField(category)
tags = TaggableManager()
publish = models.BooleanField(default=False)
def __str__(self):
return self.title
def get_absolute_url(self):
kwargs = {
'year':self.date.year,
'month':self.date.month,
'day':self.date.day,
'slug':self.slug,
}
return reverse('blog:post-detail', kwargs=kwargs)
此用于创建子弹的部分在models.py
中def create_slug(instance, new_slug=None):
slug = slugify(instance.title, allow_unicode=True)
if new_slug is not None:
slug = new_slug
qs = Post.objects.filter(slug=slug).order_by("-id")
exists = qs.exists()
if exists:
new_slug = "%s-%s" %(slug, qs.first().id)
return create_slug(instance, new_slug=new_slug)
return slug
def slug_generator(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = create_slug(instance)
pre_save.connect(slug_generator, sender=Post)
在这部分之后,您将看到我的views.py
def post(request, year, month,day, slug):
post = get_object_or_404(Post, date__year=year, date__month=month, date__day=day, slug=slug)
comment_form = CommentForm(request.POST or None)
new_comment = None
if request.method == "POST":
if comment_form.is_valid():
new_comment = comment_form.save(commit=False)
new_comment.post = post
new_comment.save()
comment_form = CommentForm()
context = {
'post':post,
'comment_form':comment_form,
}
return render(request, 'Blog/post.html', context)
这是我的urls.py(我的博客的这个URL,我在项目urls.py中包括博客的URL)
app_name = 'blog'
urlpatterns = [
path('', views.blog, name='blog'),
path('post/<int:year>/<int:month>/<int:day>/<slug:slug>/', views.post, name='post-detail'),
]
并且我使用此代码显示帖子的详细信息:
href="{{ post.get_absolute_url }}"
好,您看到我的代码我为我的博客绘制了此代码,然后尝试为自己的帖子创建漂亮的url,但无法正常工作
我在stackoverflow中搜索此错误,但找不到有用的答案我被迫再次询问这个错误谢谢
ANSWER:
您可以使用此功能来创建唯一的子弹当您具有相似的标题时,此功能为子弹添加一些随机字母
import string
import random
from django.utils.text import slugify
def random_string_generator(size = 10, chars = string.ascii_lowercase +
string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def unique_slug_generator(instance, new_slug = None):
if new_slug is not None:
slug = new_slug
else:
slug = slugify(instance.configure_slug, allow_unicode=True)
Klass = instance.__class__
qs_exists = Klass.objects.filter(slug = slug).exists()
if qs_exists:
new_slug = "{slug}-{randstr}".format(
slug = slug, randstr = random_string_generator(size = 4))
return unique_slug_generator(instance, new_slug = new_slug)
return slug
您不是在基于函数的视图兄弟中调用它,而是在告诉django他需要一年,一月和一天,并且您传递的是帖子,但您没有传递方法{{post.get_absolute_url}}
def post(request, year, month,day, slug):
post = get_object_or_404(Post, date__year=year, date__month=month, date__day=day, slug=slug) <<< #here you telling him tho get a object and passing a post as object and the post date but how he's getting the date?
comment_form = CommentForm(request.POST or None)
new_comment = None
if request.method == "POST":
if comment_form.is_valid():
new_comment = comment_form.save(commit=False)
new_comment.post = post
new_comment.save()
comment_form = CommentForm()
context = {
'post':post,
'comment_form':comment_form,
}
return render(request, 'Blog/post.html', context)