在我看来,我正在研究 Django 中的一些有趣的问题:模型继承及其在模板中的行为。为了清楚起见,我是一个 django 菜鸟,所以这可能根本不是问题,实际上:)
他是我在模型中所拥有的:
模型.py
class AbstractUserProfile(models.Model):
user = models.OneToOneField(User,
null=False, blank=False,
related_name=u'user_link')
class Meta:
abstract = True
class UserProfile(AbstractUserProfile):
personal_page = models.URLField(null=True, blank=True,
verbose_name=u'personal page url')
site_url = models.CharField(max_length=100,
null=False, blank=False,
unique=True,
verbose_name=u'web-site url')
photo = ImageField(upload_to=u'profiles',
null=True, blank=True,
verbose_name=u'Profile picture')
以及同一个 models.py 文件中的另外两个类:
class ProfileTypeOne(UserProfile):
status = models.TextField(blank=True)
def get_status(self):
return mark_safe(self.status)
class ProfileTypeTwo(UserProfile):
interests = models.TextField(blank=True)
def get_status(self):
return mark_safe(self.interests)
在模板中我有一些代码,需要调用ProfileType特定的方法,比如
.... some html .... {{ user.user_link.get_status }} ... some more html ....
O 确实知道模型继承中自动创建的 OneToOneRelationship,并且我可以通过这种方式访问所需的方法:
{{ user.user_link.profiletypeone.get_status }}
唯一的问题是,我在模板渲染的某些时候不知道配置文件类型。在不引发 ProfileTypeOne.DoesNotExist 异常的情况下,解决此问题的最佳方法是什么:
- 将此逻辑转移到视图中并创建一些标志,然后在模板中检查它并访问受尊重的子类?
- 处理模板中的 DoesNotExist 异常?(不知道怎么做)
- 在模板中使用这种冗余的低效结构(几乎是变体#2):
{{ user.user_link.profiletypeone.get_status }}{{ user.user_link.profiletypetwo.get_status }}
我之所以要将此逻辑放入模板中,是因为该模板将被多次扩展,并且此基本逻辑应该在所有模板中,因此迫使我,在将逻辑转移到视图部分的情况下,多次调用某些代码,而不是一个。
提前致谢!