2012-05-09 2 views
1

я модель под названием UserProfile определяется какМожно ли передать аргумент методу класса модели в шаблоне Django?

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 «s 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-Абрамса!

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 %} 

ответ

2

No. Написать custom filter or template tag, который проверяет их.

+0

Предположим, что я пишу специальный тег шаблона, который может принимать любое количество аргументов (для типов пользователей). Поэтому я могу использовать его как '{% has_user_types user" ad "" mo "" pm "%}'. Но я действительно хочу просто вернуть тег 'True' или' False'. Так что можно сделать что-то вроде '{% has_user_types user" te "as is_tenant%}' then do '{% if is_tenant%} ...'? – hobbes3

+0

«Установка переменной в контексте» «Теги назначения» –

+0

К сожалению, я не должен был спрашивать * Возможно ли это ... *. Я хотел спросить: «Должен ли я» или есть лучший способ сделать это? Я уже читал документацию по [тегам шаблона] (https://docs.djangoproject.com/en/dev/howto/custom-template-tags/), когда писал первый комментарий lol. Спасибо за вашу помощь! – hobbes3

Смежные вопросы