0

我正在使用查询集检索一堆东西并将它们显示为列表,然后可以单击以查看所选文章的详细信息。所以在文章的详情视图中,我有一个 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 并不是最好的主意。

4

1 回答 1

1

这是非常可悲的,但您不能将参数传递给模板中的方法(确实这是一个好主意 - 所以您几乎不要将表示逻辑与模型逻辑混为一谈:))。为此,您必须编写一个模板标签。

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

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

于 2013-04-13T21:11:02.253 回答