Внедрение пользователя в Django в свойствах модели

У меня есть эти модели в Джанго:

News
Comments
Reactions

Отношения это:

a News has various Comments
a Comment has various Reactions

Проблема в пользователе (в запросе / сеансе): пользователь может подписаться на реакцию или комментарий; он может быть авторизован или нет. (это пример foo, это не имеет особого смысла)

Я не могу сделать в шаблоне:

{% for reaction in this_news.comments.reactions %}
 {{ reaction.name }}
 {% if reaction.user_subscribed %} #reaction.user_subscribed(request.user)...
 You have subscribed this reaction!
 {% endif %}
{% endfor %}

Проблемы:

  • Я не могу вызвать метод в шаблоне с параметром (см. Комментарий выше)
  • Модели не имеют доступа к запросу

Теперь я звоню init_user метод в News Модель, передающая запрос. Тогда у меня есть тот же метод в Comment а также Reaction модель, и я должен установить user_subscribed собственность на велосипеде детей каждой модели.

Разве нет более разумного способа сделать это?

РЕДАКТИРОВАТЬ: благодаря подсказке Ignacio об использовании пользовательского тега я пытаюсь сделать универсальный режим для передачи пользователя (избегая использования замыканий, потому что я не знаю, как их использовать atm):

def inject_user(parser, token):
    try:
        # split_contents() knows not to split quoted strings.
        tag_name, method_injected, user = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError("%r tag requires exactly three arguments" % token.contents.split()[0])
    return InjectUserNode(method_injected, user)

class InjectUserNode(template.Node):
    def __init__(self, method_injected, user):
        self.method_injected = template.Variable(method_injected)
        self.user = template.Variable(user)

    def render(self, context):
        try:
            method_injected = self.method_injected.resolve(context)
            user = self.user.resolve(context)
            return method_injected(user)
        except template.VariableDoesNotExist:
            return ''

Когда я использую это {% inject_user object.method_that_receives_a_user request.user %} я пришел к этой ошибке 'str' object is not callable в method_injected(user); как я могу это исправить?

2 ответа

Решение

Я решил это не так элегантно, но у меня получилось.

Я создал своего рода синглтон в моем User определенный класс, со свойством, которое я устанавливаю в каждом представлении, которое мне нужно.

Свойство User.current,

Затем внутри моделей, где мне нужно, я получаю, что текущий пользователь смотрит в User.current,

Напишите пользовательские теги шаблона, которые берут пользователя и устанавливают переменную контекста, чтобы указать наличие или отсутствие критерия.

Другие вопросы по тегам