微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在模型中使用ForeignKey时如何避免模板中的NonType错误?

如何解决在模型中使用ForeignKey时如何避免模板中的NonType错误?

我要访问模板中的用户区域:

{% if object.seller.profile.post_code %}{{ object.seller.profile.post_code }} {% endif %}{% if object.seller.profile.city%}{{ object.seller.profile.city }}<br/>{% endif %}

{% if object.seller.profile.region.name %}{{ object.seller.profile.region.name }},{% endif %}{% if object.seller.profile.region.country.name %}{{  object.seller.profile.region.country.name }}{% endif %}

这是我的模特

class Profile(models.Model):
    user = models.OnetoOneField(User,on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg',upload_to='profile_pics',verbose_name='Profilbild')
    post_code = models.CharField(max_length=5,blank=True,verbose_name='Postleitzahl')
    region = models.ForeignKey(Region,on_delete=models.CASCADE,null=True,verbose_name='Region',help_text='Bundesland oder Kanton')
    city = models.CharField(max_length=50,verbose_name='Stadt')
    street = models.CharField(max_length=50,verbose_name='Straße')

class Region(models.Model):
    name = models.CharField(max_length=30,help_text='Bundesland oder Kanton',default='Berlin')
    symbol = models.CharField(max_length=30,verbose_name='Region-Kürzel',default='BER')
    country = models.ForeignKey('Country',verbose_name='Land',default=0)

class Country(models.Model):
    name = models.CharField(max_length=30,default='Deutschland')
    symbol = models.CharField(max_length=4,verbose_name='Kürzel',default='DE')

但是我不想强迫用户输入他们的地址数据。但是,如果未填写ForeignKey-Fields,我会得到

    'nonetype' object has no attribute 'country'

除了检查每个字段是否填充在views.py中并将其分别添加到上下文中之外,还有一种更优雅的方法吗?

解决方法

可以在个人档案模型中添加一些快捷方式来帮助解决此问题:

views.py:

class Profile(models.Model):

    ...

    @property
    def country_name(self): 
         return self.region.country.name if self.region and self.region.country else None

template.html:

...
<div> {{object.seller.profile.country_name }} </div>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。