Страница не найдена (404) в Джанго 2 - PullRequest
0 голосов
/ 06 октября 2019

Я работаю в своем блог-проекте по изучению django. Но мои URL-адреса не работают правильно, когда я создаю сообщение, мое сообщение успешно создано и сохраняется в моей базе данных, и я вижу свою открытку в своем блоге. Но когда я нажимаюпочтовая карточка для показа сообщений отправителя, получающего эту ошибку

Страница не найдена (404) Метод запроса: GET URL запроса: 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)

Эта часть для создания слаг в моделях.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 для моего блога, и я включаю URL-адрес блога в свой проект urls.py)

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 для своего поста, но он не работает правильно

Я искал в стеке потокошибка, но я не могу найти полезный ответ, и я был вынужден снова спросить об этих ошибках Спасибо

ОТВЕТ :

вы можете использовать эту функцию для создания уникальных слагов Когда выиметь похожее название этой функции добавить случайный алфавит для пули

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 

1 Ответ

0 голосов
/ 06 октября 2019

вы не вызываете его в представлении функции на основе брата, вы говорите 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)
...