私の観点では、Django の問題、つまりモデルの継承とテンプレートでの動作という興味深い問題を検討しています。明確にするために、私はジャンゴ初心者なので、これは実際にはまったく問題にならないかもしれません:)
彼は私がモデルに持っているものです:
models.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 ファイルにさらに 2 つのクラスがあります。
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 }}
このロジックをテンプレートに入れたい理由は、そのテンプレートが複数回拡張され、この基本的なロジックがすべてのテンプレートに含まれている必要があるためです。そのため、ロジックをビュー部分に転送する場合、いくつかのコードを複数回呼び出す必要があります。 1つの代わりに。
前もって感謝します!