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})
Вернуться на верх