如何处理Django模型中的瞬态数据(或如何避免全局变量)?

时间:2012-07-05 16:50:34

标签: django django-models

我有一个在我的Django app中定义的模型树(例如'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告诉模型当前登录的用户,但问题是,我有一个模型对象树,我想我必须加载并设置树中的每个模型,甚至如果我最终没有使用它们。我假设对象是懒惰的。

# 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的新手,并尝试以最好的设计开始这个项目。

1 个答案:

答案 0 :(得分: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 }}