在Django模型中添加自定义方法以了解当前用户是否是作者

时间:2013-04-13 20:55:55

标签: django models templatetags

我正在使用查询集检索一堆内容并将其显示为列表,然后可单击以查看所选文章的详细信息。 所以在文章的详细信息视图中,我有一个is_creator方法:

@login_required
def is_creator(userProfile, article):
    if userProfile == article.creator:
        return True
    else:
        return False

所以我可以随意显示一个编辑按钮。 但是在主页上,这是一个不同的故事,因为我正在进行查询,并将查询集直接提供给将使for循环显示标题的模板。如果当前用户是创建者,我仍然想知道每篇文章。

所以我正在考虑在模型中添加工作,而不是在任何地方重复代码。

@property
def is_creator(self,user):
    if self.creator.user == user:
        return 1
    else:
        return 0

我在想通过在模型中添加它,我应该能够非常轻松地调用模板{%if event.is_creator user%} test {%endif%}。似乎我错了,因为我正面临着:

TemplateSyntaxError at /
Unused 'user' at end of if expression.

我来自PHP世界,所以感觉这应该有效,但我显然做错了什么。

提前致谢:)

编辑:我猜测另一种解决方案是在视图中循环使用类似的东西:

 variables['articles'] = Event.objects.filter(
            (Q(creator=me) | Q(bringing__attendee=me)) & Q(date_start__lt=datenow) & Q(date_end__gt=datenow)
        ).order_by('-date_start')
    for article in variables['articles']:
         article.iscreator=1 (I can do some more work here)

但似乎必须循环QS并不是最好的主意。

1 个答案:

答案 0 :(得分:1)

很难过,但是你不能将params传递给模板中的方法(事实上这是一个好主意 - 所以你不要将表示逻辑与模型逻辑混合,差不多:))。您必须为此目的编写模板标记。

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

标签看起来像这样(未经测试):

@register.simple_tag(takes_context=True) #  assuming you are running in request context
def current_user_is_creator(context,article):
    user = context['request'].user
    return article.creator.user == user  #  dont forget to add proper checks

或者您可以在视图中准备所需的数据。