Django queryset в представлении ничего не возвращает в шаблон html

#python #django #django-views #django-queryset #django-listview

#python #django #django-views #django-queryset #django-listview

Вопрос:

Я хочу показать все сообщения определенного пользователя на странице его профиля, но отображается только информация о его профиле, но не сообщения.

Мой первоначальный код просто пытался перебирать сообщения в шаблоне следующим образом:

       {% for post in user.posts.all %}
      {% endfor %}
 

Но это не сработало. Итак, я попробовал это дальше.

views.py

      user = get_object_or_404(User, username=username)
     post = Post.objects.filter(created_by=user.id)

     context = {
          'user': user,
          'post': post
     }

     return render(request, 'users/profile.html', context)
 

profile.html

 <div class="user-profile">
    <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
    {{ user.username }}
    {{ user.email }}
</div>

<div class="user-post-model">
{% for post in posts %}
   <img class="rounded-circle post-img" src="{{ post.created_by.profile.image.url }}">
   {{ post.title }}
   {{ post.content|safe }}
   {{post.tag}}
   {{ post.created_by }}
   {{ post.created_at|naturaltime}}
{% endfor %}
</div>
 

Это тоже не сработало

Я также пытался использовать ListView для публикации сообщений. Это сработало, но вместо отображения информации о профиле конкретного пользователя в нем отображалась информация о профиле зарегистрированного пользователя, но сообщения конкретного пользователя.

вот так:

 def profile(request, username):
     user = get_object_or_404(User, username=username)

     context = {
          'user': user
     }

     return render(request, 'users/profile.html', context)

class UserPostListView(ListView):
     model = Post
     template_name = 'users/profile.html'
     context_object_name = 'posts'
     
     def get_queryset(self):
          user = get_object_or_404(User, username=self.kwargs.get('username'))
          return Post.objects.filter(created_by=user).order_by('-created_at')
 

Это модель post

 class Post(models.Model):
     title =  models.CharField(max_length=255)
     content = RichTextField(blank=True, null=True, max_length=30000)
     created_at = models.DateTimeField(default=timezone.now)
     created_by = models.ForeignKey(User, on_delete=models.CASCADE)
     tag =  models.CharField(max_length=255, default='uncategorised')

     class Meta:
          ordering = ('-created_at',)

     def __str__(self):
          return self.title   ' | '   str(self.created_by)

     def get_absolute_url(self):
          return reverse("post-detail", kwargs={"pk": self.pk})
 

Что не так?

Комментарии:

1. {% for post in posts %} в контексте, который вы передали post , вы все же перебираете posts

2. Вы пробовали просто использовать request.user ?

3. Даже если я введу {% for post in post %} то, что пробовал раньше, оно не будет проходить через сообщения.

4. request.user также ничего не возвращает @M-Chen-3

5. @AbdulAzizBarkat Мне нужны сообщения определенного пользователя, а не только для вошедшего в систему пользователя. Очень похоже на просмотр чьего-либо профиля / страницы учетной записи для Youtube instagram. Он должен возвращать сообщения только для учетной записи. request.user предоставляйте мне только информацию о вошедшем в систему пользователе, когда я нажимаю на чью-то учетную запись.

Ответ №1:

Чтобы перебрать связанные Post объекты User , используйте _set (Django Docs) .

Итак, в вашем случае user.post_set :

 {% for post in user.post_set.all %}
    {{ post.title }}
{% endfor %}
 

Комментарии:

1. @ImmortalNoob, рад помочь))) и успехов в кодировании.