Django — фильтровать сообщения по автору с помощью строки pk?

#django #filter #author

Вопрос:

Я создаю блог и пытаюсь дать пользователю возможность просматривать сообщения одного автора. До сих пор я пробовал разные фильтры, чтобы вернуть представление, которое работает. Это самое близкое, что я получил (я думаю), но сайт возвращается пустым. Кто — нибудь знает, чего мне не хватает?

Мой models.py

 class Author(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    username = user.name
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    
    def get_absolute_url(self):
        return reverse("author", args=[str(self.id)])
    
    def __str__(self):
        return self.user.username

class Post(models.Model):
    author = models.ForeignKey(Author, related_name="user_name",on_delete=models.CASCADE)
    title = models.CharField(max_length=250)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateField(blank=True,null=True)
 

Мой view.py

 class PostListAuthor(ListView):
    model = Post, Author
    paginate_by = 5
    context_object_name = 'author_posts'
    template_name="blog/post_author_list.html" 
    
    def get_queryset(self):
        return Post.objects.filter(author = Author.username, published_date__lte=timezone.now()).order_by("-published_date")
 

И мой urls.py имеет ли это:

 path("author/<str:pk>",views.PostListAuthor.as_view(),name="author"),
 

Ответ №1:

Спасибо Ашрафу Исламу. Я путался с get_absolute_url, и ваше решение заставило меня это понять.

Кстати, я получил ошибку, когда попробовал ваше решение, но мне удалось исправить свой код вот так. Теперь работает как заклинание.

urls.py

 path("author/<int:pk>/",views.PostListAuthor.as_view(),name="author"),
 

views.py

 def get_queryset(self):
        author_id = self.kwargs['pk']
        return Post.objects.filter(author = author_id, published_date__lte=timezone.now()).order_by("-published_date")
 

models.py

 def get_absolute_url(self):
        return reverse("author", kwargs={'pk':self.pk})
 

Ответ №2:

 path("author/<int:author_id>/",views.PostListAuthor.as_view(),name="author"),
 

и

 def get_queryset(self):
    author_id = self.kwargs['author_id']
    return Post.objects.filter(author=int(author_id)).order_by("-published_date")