1

UserProfile次のように定義されたというモデルがあります

class UserProfile(models.Model):
    user       = models.OneToOneField(User, related_name='userprofile_from_user')
    user_types = models.ManyToManyField(UserType, related_name='userprofiles_from_user_types', null=True, blank=True)

    def has_user_types(self, user_types):
        return self.user_types.filter(name__in=user_types).count()

UserTypeと定義されている

class UserType(models.Model):
    TYPE_CHOICES = (
        ('ad', 'administrator'   ), # 1
        ('mo', 'moderator'       ), # 2
        ('vi', 'viewer'          ), # 3
        ('pm', 'property manager'), # 4
        ('po', 'property owner'  ), # 5
        ('vm', 'vendor manager'  ), # 6
        ('ve', 'vendor'          ), # 7
        ('te', 'tenant'          ), # 8
    )

    name = models.CharField(max_length=2, choices=TYPE_CHOICES)

UserProfileのメソッドを使えるようにしたいhas_user_types()。ビューでは、私は次のようなことをします

if user.profile.has_user_types(['ad', 'mo', 'pm']):
    # The user is any combination of an administrator, moderator, or property manager.

しかし、テンプレートで同じことを行うことはできますか? 私は具体的にいくつかのユーザータイプをチェックしているので、次のようなことをしたかったのです

{% if user.profile.has_user_types(['te']) %}

モデルで呼び出される別のメソッド (引数を取らない) を単純に定義できることはわかってis_tenant()いますが、他のユーザー タイプも確認したかったので、統合できるかどうか疑問に思っていhas_user_types()ました。

副次的な質問: Django のデフォルト テンプレートではできない場合、Jinja2ではできるのでしょうか?


解決

Ignacio Vazquez-Abrams の助けに感謝します!

custom_tags.py:

@register.assignment_tag
def has_user_types(user_pk, *args):
    user = User.objects.get(pk=user_pk)

    return user.profile.has_user_types(args)

テンプレート:

{% load has_user_types from custom_tags %}

{# I pass the pk because I want to be able to pass any user, not just request.user #}
{% has_user_types user.pk "te" as is_tenant %}
{% if is_tenant %}
    {# Show something #}
{% endif %}
4

1 に答える 1

2

いいえ。それらをチェックするカスタム フィルターまたはテンプレート タグを記述します。

于 2012-05-09T03:28:12.120 に答える