Django“image”属性没有与之关联的文件

时间:2013-03-10 12:47:58

标签: django

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

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})

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

我的个人资料。

<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>

我对个人资料功能的解决方案

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})

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

如何配置此模板以使图片成为一个选项。如果他们没有照片就离开它,但显示人名。

感谢您帮助我

7 个答案:

答案 0 :(得分:64)

不违反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:'#' }}" />

答案 1 :(得分:48)

bobperson是同一个对象,

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

所以你可以只使用人。

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

{% if person.image %}
    <img src="{{ person.image.url }}">
{% endif %}

答案 2 :(得分:2)

我亲爱的朋友,其他解决方案虽然不错,但还不够,因为如果用户没有个人资料照片,则应轻松显示默认图像(无需迁移)。因此,您可以按照以下步骤操作:

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

@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">

答案 3 :(得分:1)

您还可以使用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:'#' }}" />

答案 4 :(得分:1)

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

由于models.py中的该对象具有blank = False,而且我正在遍历该对象,因此它不断产生错误,直到我在管理员中为数据库渲染添加替换图片为止。

答案 5 :(得分:0)

并非OP到底在寻找什么,但是另一种可能的解决方案是为ImageField设置默认值:

 class Profile(models.Model):
    # rest of the fields here
    image = models.ImageField(
        upload_to='profile_pics/',
        default='profile_pics/default.jpg')

答案 6 :(得分:0)

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

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