0

私の観点では、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 例外を発生させずに、この問題を解決する最善の方法は次のとおりです。

  1. このロジックをビューに転送してフラグを作成し、それをテンプレートでチェックして、尊重されるサブクラスにアクセスしますか?
  2. テンプレートで DoesNotExist 例外を処理しますか? (方法がわからない)
  3. テンプレートでこの冗長で非効率的な構造を使用します (ほぼバリアント #2):

{{ user.user_link.profiletypeone.get_status }}{{ user.user_link.profiletypetwo.get_status }}

このロジックをテンプレートに入れたい理由は、そのテンプレートが複数回拡張され、この基本的なロジックがすべてのテンプレートに含まれている必要があるためです。そのため、ロジックをビュー部分に転送する場合、いくつかのコードを複数回呼び出す必要があります。 1つの代わりに。

前もって感謝します!

4

1 に答える 1