0

我在 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,传递请求。然后我在CommentReaction模型中有相同的方法,我必须设置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 callablemethod_injected(user)我该如何解决?

4

2 回答 2

1

编写自定义模板标签以获取用户并设置上下文变量以指示标准的存在或不存在。

于 2012-07-21T15:33:13.997 回答
0

我以一种不太优雅的方式解决了它,但它对我有用。

我在我User定义的类中创建了一种单例,并在我需要的每个视图中设置了一个属性。

该物业是User.current

然后,在模型内部,我需要让当前用户查看User.current

于 2012-07-28T14:33:30.077 回答