1

我在我的 Django 应用程序中定义了一个模型树(例如,'a' 是一个顶级模型,它有很多'b',它有很多'c')。我也有适当呈现这些的视图/模板。对于这些模型中的每一个,我通常需要根据当前登录的用户进行数据库查询。

例如,它类似于堆栈溢出的每个用户如何用星号标记问题。如果我的模型是问题,我会询问模型当前用户是否已为这个问题加注星标,然后在模板中适当地呈现它。

我的第一个想法是尝试在模板中传递一个参数(我现在知道这不起作用)。

# template
{{ question.is_starred(request.user) }}    # Can't work.

我的第二个想法是拥有某种类型的全局变量(原则上我不喜欢)。

# model
class question (Models.model)
    def _is_starred(self):
        # Use a global variable to find out the current logged in user!

我的第三个想法是让视图告诉模型当前登录的用户,但问题是,我有一个模型对象树,我想我必须加载和设置树中的每个模型,即使我不'不要最终使用它们。我假设对象是延迟加载的。

# view
def view_one_question(request, question_id):
    q = Question.objects.get(pk=question_id)
    q.SetCurrentlyLoggedInUser (request.user.id)
    # !!!! But what about the other network of objects that the question has?
    return render_to_response(...)

任何建议表示赞赏。我是 Django 的新手,并试图以最好的设计开始这个项目。

4

1 回答 1

3

你的第一个例子是正确的想法,但错误的实现。您不能将参数传递给 Django 模板中的方法。解决这个问题的最简单方法是一个简单的过滤器:

# yourapp/templatetags/somefile.py

from django import template

register = template.Library()

@register.filter
def is_starred_for_user(question, user):
    return question.is_starred(user)

然后,在您的模板中:

{% load somefile %}

{{ question|is_starred_for_user:request.user }}
于 2012-07-05T16:55:39.830 回答