Изображение профиля Django неправильно отображает изображение зарегистрированного пользователя (в каждом профиле)

#python #django #templates #view #model

#python #django #шаблоны #Вид #Модель

Вопрос:

Любая помощь в этом была бы очень признательна.

Я расширил модель пользователя Django с помощью отношения OneToOne на другую модель с именем UserProfile, которая содержит поле изображения с именем profile_pic .

Настройки для корневой папки мультимедиа настроены правильно в settings.py и упоминается в корне urls.py .

Что-то не так с представлением на основе классов, общим ListView для отображения сообщений о продукте пользователя, или я неправильно ссылаюсь на profile_pic в шаблоне.

Есть идеи о том, как отобразить изображение профиля каждого пользователя в их связанном профиле пользователя? В настоящее время, когда пользователь входит в систему, его / ее изображение отображается в каждом профиле. Использование Django 3.1.2

models.py

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

    class Meta:
        verbose_name_plural = "User Profiles"

    def __str__(self):
        return f'{self.user.username} UserProfile'
    
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
  

views.py

 class ProfileListView(ListView):
    model = Product
    template_name = 'users/profile.html'
    context_object_name = 'products' 
    paginate_by = 12

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return Product.objects.filter(user=user).order_by('-creation_date')
  

profile.html

 {% if user.userprofile.profile_pic %}
        <img class="rounded-circle" src="{{ user.userprofile.profile_pic.url }}" alt="">
        {% else %}
        <img class="rounded-circle" src="media/default_profile_pic.jpg" alt="">
        {% endif %}
  

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

1. user автоматически заполняется текущим зарегистрированным пользователем, когда у вас есть django.core.context_processors.auth список ваших контекстных процессоров. Ваше представление имеет имя ProfileList , но оно возвращает Product объекты, а имя контекстной переменной products равно . Вы не определяете user себя.

2. Спасибо @Selcuk, я ценю понимание. Не могли бы вы предложить мне изменить модель ProfileList = UserProfile и контекстную переменную на userprofile ? Если это так, у меня не будет доступа к продуктам. Что может быть эффективным способом определения пользователя при создании его продуктов, доступных в представлении списка профилей? Модель продукта имеет отношение ForeignKey к пользователю. Еще раз спасибо. Это немного искажает мой разум.

3. Я разберусь с этим. Собираюсь переработать ProfileListView.

4. Это зависит от того, что вы хотите от этого представления. Если он предназначен для возврата списка продуктов, принадлежащих указанному пользователю (но не обязательно зарегистрированному пользователю), сохраните код (возможно, переименуйте его в ProductListView для согласованности) и используйте {{ product.user.userprofile.profile_pic.url }} в своем шаблоне.