Django Показать все сообщения от одного пользователя

Я создаю клон instagram на Django. У меня есть базовая функциональность, где пользователь может разместить изображение, и оно отображается на главной странице. Я хотел бы сделать "страницу пользователя", на которой будут отображаться только посты пользователя. Например, example.com/foobar будет отображать сообщения только от пользователя 'foobar'.

Я считаю, что у меня есть urls.py и шаблон, работающие правильно, но я не могу понять, как только перебирать элементы и вытаскивать те, которые принадлежат определенному пользователю. Я понимаю, что это должен быть какой-то queryset, но кроме этого я в тупике. Должен ли это быть собственный класс, или я могу расширить существующий класс PostList для извлечения постов одного автора?

post_detail.html - получает все изображения, хранящиеся в базе данных, это работает нормально.

                    {% for post in object_list %}
                        <td><a href="{% url 'detail' pk=post.pk %}"><img src="{{ post.image.url }}" width="300"></a></td>
                        {% if forloop.counter|modulo:4 %}    
                        </tr><tr>
                        {% endif %}
                    {% endfor %}

profile.html - показывает все сообщения пользователя (как в example.com/foobar)

    <table>
        <tr>
        {% for post in object_list %}
            <td><a href="{% url 'detail' pk=post.pk %}"><img src="{{ post.image.url }}" width="300"></a></td>
            {% if forloop.counter|modulo:4 %}    
            </tr><tr>
            {% endif %}
        {% endfor %}
        </tr>
    </table>

urls.py - я считаю, что это работает правильно.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', PostList.as_view(), name='list'),
    path('<str:username>/', Profile.as_view(), name='user_profile'),

views.py

from posts.models import Post

class PostList(ListView):
    ordering = ['-created']
    paginate_by = 12
    model = Post

class Profile(ListView):
    template_name = 'posts/profile.html'
    UserName = self.kwargs.get("username")
    queryset = PostList.queryset
    
    .filter(author = UserName)
    return queryset

models.py

class Post(models.Model):
    image = models.ImageField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

Вы можете отменить get_queryset():

class ProfileView(ListView):
    template_name = 'posts/profile.html'
    model = Post

    def get_queryset(self, **kwargs):
        return super().get_queryset(**kwargs).filter(
            author__username=self.kwargs['username']
        )

Примечание: В Django представления, основанные на классах (CBV), часто имеют суффикс …View, чтобы избежать столкновения с именами моделей. Поэтому вы можете переименовать класс представления в ProfileView, вместо Profile.

Вернуться на верх