Get() получил неожиданный аргумент ключевого слова 'title'
я хочу получить блог с полем модели, которое является уникальным, но когда я нажимаю на конкретный блог, он выбрасывает мне вышеупомянутую ошибку. вот мои представления
class Blogs(View):
def get(self, request):
blog_list = Blog.objects.order_by('-joined_date')
return render(request, 'blogs.html',{'blog_list':blog_list})
class ReadBlogs(View):
def get(self, request, url_title):
blog = Blog.objects.filter(title=url_title)
return render(request,'blogs_read.html',{'blog':blog})
моя модель
class Blog(models.Model):
title = models.CharField(max_length=48, blank=False)
urltitle = models.SlugField(max_length=48, blank=False, unique=True)
title_image = models.ImageField(upload_to='blog',blank=True, null=True)
subone = models.CharField(max_length=80, blank=False)
subone_image = models.ImageField(upload_to='blog',blank=True,null=True)
onedes = models.TextField(blank=False)
мой html для поиска нужного блога
<div class="blogs">
{% for blogs in blog_list %}
<a class="products" href="{% url 'blogs:readblog' title=blogs.urltitle %}">
<div class="blog col-4" style="width: 18rem; height:350px">
<img class="img" src="{{ blogs.title_image.url }}" alt="" height="250px" width="100%">
<div class="detail">
<h4 class="title text-center" style="color: #025; font-family:cursive;">{{blogs.title}}</h4>
</div>
</div>
</a>
{% endfor %}
</div>
my url.py
urlpatterns = [
path('blogs/',Blogs.as_view(),name="Blogs"),
path('<slug:title>/',ReadBlogs.as_view(),name="readblog")
]
Как вы можете видеть mu urltitle является уникальным полем slug так, но когда я нажал на определенный блог я получил вышеупомянутую ошибку любая идея, что вызывает ошибку
Параметр URL назван title
, а не :url_title
path('<slug:title>/',ReadBlogs.as_view(),name='readblog')
поэтому метод .get(…)
должен работать с title
в качестве параметра:
class ReadBlogs(View):
# title ↓
def get(self, request, title):
blog = Blog.objects.filter(title=title)
return render(request,'blogs_read.html',{'blog':blog})
Здесь blog
- это коллекция из нуля, одного или более блогов. Если вы хотите передать один Blog
объект, вы должны получить один объект, например, с помощью get_object_or_404
:
from django.shortcuts import get_object_or_404
class ReadBlogs(View):
def get(self, request, title):
blog = get_object_or_404(Blog, title=title)
return render(request,'blogs_read.html',{'blog':blog})
Возможно, также имеет смысл работать с DetailView
[Django-doc] для автоматического отображения элемента должным образом:
from django.shortcuts import get_object_or_404
from django.views.generic.detail import DetailView
class ReadBlogs(DetailView):
model = Blog
template_name = 'blogs_read.html'
def get_object(self, *args, **kwargs):
return get_object_or_404(Blog, title=self.kwargs['title'])
шаблон
{% url 'blogs:readblog' title=blogs.urltitle %}
здесь вы проходите title=urltitle
, поэтому на самом деле вы проходите urltitle
!
просмотров
# your-code | wrong
class ReadBlogs(View):
def get(self, request, title):
# ======== HERE, TITLE IS ACTUALLY urltitle! ==================
readblog = Blog.objects.filter(title=title)
return render(request,'blogs_read.html', {'readblog':readblog})
# correct
class ReadBlogs(View):
def get(self, request, title):
readblog = Blog.objects.filter(urltitle = title)
return render(request,'blogs_read.html', {'readblog':readblog})