Внедрение пользователя в 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
,
Напишите пользовательские теги шаблона, которые берут пользователя и устанавливают переменную контекста, чтобы указать наличие или отсутствие критерия.