75

当用户注册我的应用程序时。当他到达个人资料页面时,我收到此错误。

The 'image' attribute has no file associated with it.
Exception Type: ValueError 
Error during template rendering
In template C:\o\mysite\pet\templates\profile.html, error at line 6
1 <h4>My Profile</h4>
2  
3 {% if person  %}
4 <ul>           
5   <li>Name: {{ person.name }}</li>
6   <br><img src="{{ person.image.url }}">
Traceback Switch back to interactive view
File "C:\o\mysite\pet\views.py" in Profile
 71.     return render(request,'profile.html',{'board':board ,'person':person})

我认为发生此错误是因为我的模板需要图像并且看到他刚刚注册他无法添加图像,除非他转到编辑页面并添加一个页面然后他可以访问个人资料页面。

我的个人资料.html

<h4>My Profile</h4>

{% if person  %}
<ul>           
    <li>Name: {{ person.name }}</li>
    <br><img src="{{ person.image.url }}">


</ul>
{% endif %}

views.py 中的我的个人资料功能

def Profile(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('world:LoginRequest'))
    board = Board.objects.filter(user=request.user)
    person = Person.objects.get(user=request.user)
    return render(request,'profile.html',{'board':board ,'person':person})

我通过创建一个 Person 对象的 2 个实例并在我的模板中用 if 分隔它们来尝试此解决方案,但它没有成功。

<h4>My Profile</h4>

{% if person  %}
<ul>           
    <li>Name: {{ person.name }}</li>
 </ul>
{% endif %}
{% if bob %}
<ul>           
<br><img src="{{ bob.image.url }}">
</ul>

我对 Profile 函数的解决方案

def Profile(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('world:LoginRequest'))
    board = Board.objects.filter(user=request.user)
    person = Person.objects.get(user=request.user)
    bob = Person.objects.get(user=request.user)

    return render(request,'profile.html',{'board':board ,'person':person,'bob':bob})

我一直在阅读内置模板标签和过滤器的文档我认为这里的解决方案是使用 (和) 模板标签,但我似乎无法正确使用它。

如何配置此模板以使图片成为选项。如果他们没有照片,请留下它,但显示人名。

感谢你们对我的帮助

4

8 回答 8

103

bob并且person是同一个对象,

person = Person.objects.get(user=request.user)
bob = Person.objects.get(user=request.user)

所以你可以只用一个人。

在您的模板中,image首先检查是否存在,

{% if person.image %}
    <img src="{{ person.image.url }}">
{% endif %}
于 2013-03-10T12:54:27.510 回答
87

不违反 DRY 的更好方法是向模型类添加一个辅助方法,例如:

@property
def image_url(self):
    if self.image and hasattr(self.image, 'url'):
        return self.image.url

并使用 default_if_none 模板过滤器提供默认网址:

<img src="{{ object.image_url|default_if_none:'#' }}" />
于 2013-05-20T07:26:59.097 回答
10

我亲爱的朋友,其他解决方案很好但还不够,因为如果用户没有头像,您应该轻松显示默认图像(不需要迁移)。因此,您可以按照以下步骤操作:

将此方法添加到您的人员模型中:

@property
def get_photo_url(self):
    if self.photo and hasattr(self.photo, 'url'):
        return self.photo.url
    else:
        return "/static/images/user.jpg"

您可以使用任何路径(/media、/static 等),但不要忘记将默认用户照片作为 user.jpg 放入您的路径。

并在模板中更改您的代码,如下所示:

<img src="{{ profile.get_photo_url }}" class="img-responsive thumbnail " alt="img">
于 2019-11-09T01:54:50.340 回答
4

不完全是 OP 所寻找的,但另一种可能的解决方案是为 ImageField 设置默认值:

 class Profile(models.Model):
    # rest of the fields here
    image = models.ImageField(
        upload_to='profile_pics/',
        default='profile_pics/default.jpg')
于 2019-06-12T13:56:00.343 回答
2

您还可以使用 Python 3 内置函数getattr创建新属性:

@property
def image_url(self):
    """
    Return self.photo.url if self.photo is not None, 
    'url' exist and has a value, else, return None.
    """
    if self.image:
        return getattr(self.photo, 'url', None)
    return None

并在您的模板中使用此属性:

<img src="{{ my_obj.image_url|default_if_none:'#' }}" />
于 2020-07-28T08:01:51.207 回答
2

我认为您在模型字段中的问题,请尝试输入默认图像值,如下所示:

PRF_image = models.ImageField(upload_to='profile_img', blank=True, null=True , default='profile_img/925667.jpg')

或者您可以在类模型中添加一个方法,如下所示,如果存在则返回 PRF_image,如果不存在则返回空字符串:

@property
def my_PRF_image(self):

    if self.PRF_image :
        return self.PRF_image.url
    return ''

在您的模板中,您可以使用:

{{ your_object.my_PRF_image }}

我希望这有帮助。

于 2020-09-22T11:44:40.723 回答
1

也许这有帮助,但我的数据库没有保存页面上显示的对象的图片。

由于models.py中的那个对象有blank=False,而且我正在循环遍历对象,它不断地给出一个错误,直到我在管理员中添加一张替换图片供数据库渲染。

于 2020-10-18T09:19:26.247 回答
0

当任何一个或多个项目没有添加图像而其余项目添加时,也会出现此错误。要解决这个问题:

class Product(models.Model):
    pname = models.CharField(max_length=30)
    price = models.IntegerField()
    img = models.ImageField(null = True,blank = True)
    def __str__(self):
        return self.pname
    @property
    def imageURL(self):
        try:
            url = self.img.url
        except:
            url=''
        return url
于 2021-09-18T10:34:53.807 回答