首页 > 解决方案 > django,评论中不显示头像

问题描述

我通过一对一的字段扩展了标准 django 用户模型。制作新闻块,并在那里添加评论。在评论中我无法显示来自 UserProfile 模型的用户头像,因为不明白如何正确地询问数据库 D;。这是我的代码:

主/模型.py

from django.db import models
from django.utils import timezone
from django.contrib import auth
from django.contrib.auth.forms import User
from django.shortcuts import render, redirect
from profiles.models import UserProfile

# Create your models here.
class News(models.Model):
news_title = models.CharField(max_length=250)
news_body =  models.TextField(max_length=2000, blank=True)
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
image = models.FileField()
published_date = models.DateTimeField(blank=True, null=True)

def publish(self, request):
    self.published_date = timezone.now()
    self.save()
    return redirect('index')

def __str__(self):
    return self.news_title

class Comment(models.Model):
    news = models.ForeignKey('main.News', related_name='comments', 
on_delete=models.CASCADE)
author = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
approved_comment = models.BooleanField(default=False)

def approve(self):
    self.approved_comment = True
    self.save()

def __str__(self):
    return self.text

配置文件/models.py

class UserProfile(models.Model):
    JEW_CHOICE = (
        ('Да', 'Да'),
        ('Нет', 'Нет'),
    )
    MF_CHOICE = (
        ('М', 'М'),
        ('Ж', 'Ж')
    )

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    country = models.CharField(max_length=100, default='', blank=True)
    city = models.CharField(max_length=100, default='', blank=True)
    description = models.CharField(max_length=500, default='', blank=True)
    website = models.URLField(default='', blank=True)
    avatar = models.ImageField(default='', blank=True)
    gender = models.CharField(max_length=100, choices = MF_CHOICE, default = 'М', blank=True)
    jew = models.CharField(max_length=100, choices = JEW_CHOICE, default = 'Да', blank=True)

    def __str__(self):
        return self.user.username

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.get_or_create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.userprofile.save()

@property
def avatar_url(self):
    if self.avatar and hasattr(self.avatar, 'url'):
        return self.avatar.url

main/views.py(meme_detail 是视图,应该是用户信息的评论)

def meme_detail(request, pk):
    news = get_object_or_404(News, pk=pk)
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.author = request.user
            comment.news = news
            comment.save()
            return redirect('main:meme_detail', pk=news.pk)
    else:
        form = CommentForm()
    return render(request, 'main/meme_detail.html', {'news': news, 'form': form,})

meme_detail.html(带有评论的新闻模板)

{% extends 'main/base.html' %}

{% block body %}


    <h2>{{news.news_title}}</h2>
    <img src='{{news.image.url}}' name='image' width='500px;'><br>
    {{news.news_body}} <br><br>
    <div class="row">
    <div class="col">
        <b>{{news.author}}</b>
    </div>
    <div class="col">
        <i>{{news.published_date}}</i> 
    </div>
    </div>
    <div class="underline"></div>
<h3>Комментарии:</h3><br>
{% for comment in news.comments.all %}

    <div class="row">
        <div class="col-"><img src="{{ userprofile.avatar.url }}" alt="user-avatar" width="100px" height="100px"></div>
        <div class="col">{{ comment.text }}</div>
    </div>
    <div class="row">
        <div class="col"><strong>{{ comment.author }}</strong></div>
        <div class="col">{{ comment.created_date}}</div>
    </div>
    <div class="underline"></div>
    <br>

{% empty %}
    <p>Пока ещё нет комментариев :(</p>
{% endfor %}

{% if request.user.is_authenticated %}
<div class="row">
    <form method="POST">
        {% csrf_token %}
        {{form.text}}<br><br>
        <a class="btn btn-success" href="{% url 'main:meme_detail' pk=news.pk %}"><button class='btn btn-success'>Добавить коммент! </button></a>
    </form>
</div>
{% else %}

<i>Вы не можете писать комментарии, необходимо зарегистрироваться!</i>
{% endif %}


{% endblock %}

因此,在此模板中,“userprofile.avatar.url”应该是用户头像上的对象引用。我尝试了很多东西,但总是一样:不显示

标签: pythondjango

解决方案


你应该做:

<img src="{{ comment.author.userprofile.avatar.url }}" alt="user-avatar" width="100px" height="100px">

您的评论对 User(作者)有一个外键,而 User 对 UserProfile 有一个一对一的字段,即具有 avatar 属性的字段。

还有另一个提示:

您不应该真正缩小 CSS 中的图像(宽度:100 像素;高度:100 像素;),而是使用允许您创建图像缩略图的工具。我使用sorl-thumbnail并且不能推荐它。

原因是,如果每个用户都上传一张 1000x1000 的图片,那么您正在下载那些您并不真正需要的大图片,因此您的网站会变慢。


推荐阅读