#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