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

#python #django

#python #django

Вопрос:

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

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

Я могу добавлять сведения о пользователе / дизайнере в каждое зацикленное сообщение, но я не хочу, чтобы это повторялось с каждым сообщением, я просто хочу, чтобы оно появлялось один раз, как {{ view.kwargs.username }} поскольку эта страница доступна только этому пользователю / дизайнеру

Вот models.py

 class Post(models.Model):
    designer = models.ForeignKey(User, on_delete=models.CASCADE, related_name="post")
    title = models.CharField(max_length=100, unique=True)
  

вот модель профиля, относящаяся к каждому пользователю

 class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
    first_name = forms.CharField()
    last_name = forms.CharField()
    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name',
                  'email']
  

вот представления для списка сообщений пользователя, который фильтруется конкретным пользователем / дизайнером, а не зарегистрированным пользователем

 class UserPostListView(ListView):
    model = Post
    template_name = "user_posts.html"
    context_object_name = 'posts'
    queryset = Post.objects.filter(admin_approved=True)
    paginate_by = 6

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return Post.objects.filter(designer=user, admin_approved=True).order_by('-date_posted')

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        has_items = Item.objects.filter(designer__username=self.kwargs['username']).exists()
        context['has_items'] = has_items
        return context
  

вот шаблон

 {% if has_items %}
<h1 class="display-4">Hello, this is {{ view.kwargs.username }} </h1>
<img class="profile_image" src={{ designer.profile.image.url }}> <----------- I want it to appear
{{ designer.email }}<----------- I want it to appear
{% else %}
Show nothing
{% endif %}

{% for post in posts %}
Post details
{% endfor %}

  

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

1. @ItsMilann верно, но это должно быть внутри цикла, я не хочу, чтобы это повторялось с каждым сообщением

2. если это связано с дизайнером, почему бы вам не создать своего рода подробное представление для пользователя / дизайнера и перечислить все сообщения пользователя.

Ответ №1:

Вы можете добавить это в контекст:

 from django.contrib.auth import get_user_model

class UserPostListView(ListView):
    model = Post
    template_name = 'user_posts.html'
    context_object_name = 'posts'
    queryset = Post.objects.filter(admin_approved=True)
    paginate_by = 6

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            designer__username=self.kwargs['username']
        ).order_by('-date_posted')

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['designer'] = designer = get_object_or_404(
            get_user_model(),
            username=self.kwargs['username']
        )
        context['has_items'] = Item.objects.filter(designer=designer).exists()
        return context