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