Posts.models.Blog.DoesNotExist: Блог, соответствующий запросу, не существует
я пытаюсь использовать slug для навигации. вот html тег
<a href="{% url 'blog_details' blog.slug|slugify %}">Read More</a>
urls.py
path('details/<slug:slug>/', views.blog_details, name='blog_details'),
models.py
slug= models.SlugField(max_length=264,unique=True,null=True,allow_unicode=True)
вот как я создаю автоматический слизняк
def Creating_blog(request):
form=BlogForm()
if User.is_authenticated:
if request.method=='POST':
form=BlogForm(request.POST,request.FILES)
if form.is_valid:
blog_obj=form.save(commit=False)
blog_obj.author=request.user
title=blog_obj.blog_title
blog_obj.slug = title.replace(' ','-') + '-'+ str(uuid.uuid4())
blog_obj.save()
return redirect('index')
return render(request,'blogs/creatingblog.html',context={'form':form})
это вид страницы с подробной информацией о блоге
def blog_details(request, slug):
if User.is_authenticated:
blog = Blog.objects.get(slug=slug)
already_liked = Likes.objects.filter(blog=blog, user= request.user)
if already_liked:
liked = True
else:
liked = False
comments=Comment.objects.filter(blog=blog)
commet_form=CommentForm()
if request.method=='POST':
commet_form=CommentForm(request.POST)
if commet_form.is_valid():
comment=commet_form.save(commit=False)
comment.user=request.user
comment.blog=blog
comment.save()
return HttpResponseRedirect(reverse('blog_details',kwargs={'slug':slug}))
return render(request,'blogs/blogdetails.html',context={'blog':blog,'comment_form':commet_form,'comments':comments,'like':liked})
else:
HttpResponseRedirect(reverse('login'))
проблема должна быть в
C:\Users\ITS\Desktop\blogger\Blog\posts\views.py, line 51, in blog_details
blog = Blog.objects.get(slug=slug)
Если я использую pk=id вместо slug, это работает. Но когда я пытаюсь поймать с помощью slug, ошибка возрастает. Я застрял здесь на несколько дней и не могу найти, что не так.
Пропуская slug через фильтр шаблонов |sligify
[Django-doc], он может преобразовать некоторые slug так, что ссылка на оригинальный slug станет невозможной. Вам следует удалить фильтр шаблонов, и работать с:
<a href="{% url 'blog_details' blog.slug %}">Read More</a>
But regardless, slugifying yourself is not a good idea. You can use Django's slugify(…)
function [Django-doc] to do this properly. The view also contains some problems, for example User.is_authenticated
will always have truthiness True
, and thus never fail, and .is_valid()
[Django-doc] is a method, so you need to call this:
from django.contrib.auth.decorators import login_required
from django.utils.text import slugify
@login_required
def creating_blog(request):
form = BlogForm()
if request.method == 'POST':
form = BlogForm(request.POST, request.FILES)
if form.is_valid():
form.instance.author = request.user
form.instance.slug = slugify(f'{form.instance.title} {uuid.uuid4()}')
form.save()
return redirect('index')
return render(request, 'blogs/creatingblog.html', {'form':form})
Note: You can limit views to a view to authenticated users with the
@login_required
decorator [Django-doc].
Note: You can make use of
django-autoslug
[GitHub] to automatically create a slug based on other field(s).
Note: It is often better to use
get_object_or_404(…)
[Django-doc], then to use.get(…)
[Django-doc] directly. In case the object does not exists, for example because the user altered the URL themselves, theget_object_or_404(…)
will result in returning a HTTP 404 Not Found response, whereas using.get(…)
will result in a HTTP 500 Server Error.
Наконец-то это работает. Я только внес небольшие изменения. Теги якоря
<a href="{% url 'blog_details' slug=blog.slug %}">Read More</a>
после изменения этой ошибки появилась еще одна
NoReverseMatch at /blogs/
Reverse for 'blog_details' with keyword arguments '{'slug': '9Analysing-the-FIA-Rulebook-after-the-Abu-Dhabi-Grand-Prix-—-A-Lawyer’s-Perspective-9861e7b8-1c14-4fdd-abb6-e2d8398cf318'}' not found. 1 pattern(s) tried: ['details/(?P<slug>[-a-zA-Z0-9_]+)/$']
я изменил urls.py
path('details/(?P<slug>[-a-zA-Z0-9_]+)/$', views.blog_details, name='blog_details'),
И тогда я теперь работаю. Хотя в терминале появляется одно предупреждение
WARNINGS:
?: (2_0.W001) Your URL pattern 'details/(?P<slug>[-a-zA-Z0-9_]+)/$' [name='blog_details'] has a route that contains '(?P<', begins with a '^', or ends with a
'$'. This was likely an oversight when migrating to django.urls.path().
что означает "запрет на использование django.urls.path()"?