Как лучше писать теги шаблонов в Django - PullRequest
2 голосов
/ 01 декабря 2009

Я видел, как я могу написать теги шаблона, которые устанавливают переменную контекста на основе шаблона, подобного этому

{% my_template_tag 'blah' as my_context_variable %}

Но я бы хотел сделать это:

, учитывая, что group и user установлены в контексте в представлении

{% is_in_group group user as is_member %}

{% if is_member %}
   #.... do stuff ....
{% endif %}

или в идеале что-то вроде этого:

{% if is_in_group group user %}
   # ....
{% end if %}

Очевидно, что наоборот - просто установить is_member в представлении - но это всего лишь пример, и в любом случае было бы полезно узнать, как сделать что-то подобное!

Ответы [ 4 ]

13 голосов
/ 01 декабря 2009

У Евгения хорошая идея с тегом шаблона smart_if. Однако, если это не сработает, вы, вероятно, обнаружите, что пользовательский фильтр легче написать для такого сравнения. Что-то вроде:

@register.filter
def is_in(obj, val):
    return val is in obj

и вы бы использовали его так:

{% if user|is_in:group.users %}
4 голосов
/ 01 декабря 2009

Что не так с {{ perms.model_name.permission_name }}? (Поставляется с django.core.context_processors.auth .)

Группы Django - это просто наборы разрешений, и разрешать или запрещать доступ к определенному элементу следует по индивидуальному разрешению.

Или, если вы действительно хотите написать свой собственный тег или фильтр, есть много документации . И если это не сработает, есть другие языки шаблонов, которые вы можете использовать, которые могут делать то, что вы хотите лучше.

Однако , я ожидаю, что написание тега будет ненужным. Джанго довольно хорошо понял, что вы действительно хотите сделать. Иногда, чтобы выяснить это, нужно немного покопаться.

3 голосов
/ 01 декабря 2009

попробуйте это с помощью smart if tag:

{% if group in user.groups %}
    ...
{% endif %}
0 голосов
/ 02 декабря 2009

Фильтр Дэниела должен помочь. В качестве тега шаблона это может быть что-то вроде этого:

class IsInGroupNode(Node):
    def __init__(self, group, user, varname):
        self.member =  template.Variable(user)
        self.group = template.Variable(group)
        self.varname = varname


    def render(self, context):
        self.group = self.group.resolve(context)
        self.user = self.user.resolve(context)
        context[self.varname] = self.user in self.group.user_set.all()
        return  ''


def is_in_group(parser, token):
    bits = token.contents.split()
    #some checks
    return IsInGroupNode(bits[1], bits[2],bits[4])

is_in_group = register.tag(is_in_group)

В шаблоне вы будете использовать свою подпись тега

{% is_in_group group user as is_member %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...