我有一个在我的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的新手,并尝试以最好的设计开始这个项目。
答案 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 }}