я модель под названием 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 %}
Предположим, что я пишу специальный тег шаблона, который может принимать любое количество аргументов (для типов пользователей). Поэтому я могу использовать его как '{% has_user_types user" ad "" mo "" pm "%}'. Но я действительно хочу просто вернуть тег 'True' или' False'. Так что можно сделать что-то вроде '{% has_user_types user" te "as is_tenant%}' then do '{% if is_tenant%} ...'? – hobbes3
«Установка переменной в контексте» «Теги назначения» –
К сожалению, я не должен был спрашивать * Возможно ли это ... *. Я хотел спросить: «Должен ли я» или есть лучший способ сделать это? Я уже читал документацию по [тегам шаблона] (https://docs.djangoproject.com/en/dev/howto/custom-template-tags/), когда писал первый комментарий lol. Спасибо за вашу помощь! – hobbes3