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

don*_*y72 43 django

当用户注册我的app.I当他到达个人资料页面时收到此错误.

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})
Run Code Online (Sandbox Code Playgroud)

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

我的个人资料

<h4>My Profile</h4>

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


</ul>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

我的个人资料功能在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})
Run Code Online (Sandbox Code Playgroud)

我尝试了这个解决方案,创建了一个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>
Run Code Online (Sandbox Code Playgroud)

我对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})
Run Code Online (Sandbox Code Playgroud)

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

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

感谢你们对我的帮助

tej*_*rss 68

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

@property
def image_url(self):
    if self.image and hasattr(self.image, 'url'):
        return self.image.url
Run Code Online (Sandbox Code Playgroud)

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

<img src="{{ object.image_url|default_if_none:'#' }}" />
Run Code Online (Sandbox Code Playgroud)

  • 小备注:可以完全省略“@property”。无论哪种方式,“object.image_url”都可以在 django 模板中工作,无需使用“()”。 (2认同)

iMo*_*om0 59

bob并且person是同一个对象,

person = Person.objects.get(user=request.user)
bob = Person.objects.get(user=request.user)
Run Code Online (Sandbox Code Playgroud)

所以你可以只使用人.

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

{% if person.image %}
    <img src="{{ person.image.url }}">
{% endif %}
Run Code Online (Sandbox Code Playgroud)


小智 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"
Run Code Online (Sandbox Code Playgroud)

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

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

<img src="{{ profile.get_photo_url }}" class="img-responsive thumbnail " alt="img">
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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


K.A*_*K.A 5

你有两个选择:

  • 第一:

在模型字段中尝试输入默认图像值,如下所示:

PRF_image = models.ImageField(upload_to='profile_img', blank=True, null=True , default='profile_img/925667.jpg')
Run Code Online (Sandbox Code Playgroud)
  • 第二个(推荐):

在类模型中添加一个自定义方法,如下所示,如果存在则返回 PRF_image url,如果不存在则返回空字符串:

PRF_image = models.ImageField(upload_to='profile_img', blank=True, null=True )

@property
def my_PRF_image(self):

    if self.PRF_image :
        return self.PRF_image.url
    return ''
Run Code Online (Sandbox Code Playgroud)

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

{{ your_object.my_PRF_image }}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。