在模型中使用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>