在Django 2中找不到页面(404)

问题描述 投票:0回答:1

我正在我的博客项目中学习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 
python django view slug
1个回答
0
投票

您不是在基于函数的视图兄弟中调用它,而是在告诉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)
© www.soinside.com 2019 - 2024. All rights reserved.