我一直在寻找其他答案,但我仍然不明白为多个视图使用公共代码的最快和最好的方法是什么。
让我们说我有这个代码,它反映了我希望在许多视图中显示的用户点。
if(request.user.is_authenticated()):
# UserLove
userLove = 0
ul = Love.objects.filter(user=request.user.id)
for u in ul:
userLove += u.amount
else:
userLove= 0
我看到有关使用装饰器的文字。我听说过通用视图和子视图,有人还提到了context processors
你能告诉我哪个是最好的,如果我以View1和View2为例,我的代码会怎么样?感谢名单!
答案 0 :(得分:2)
我不确定我同意装饰器或模板标签是最好的方法。装饰器应用于功能(即视图),因此,例如,如果您想确保用户在访问视图之前已登录,则可以使用装饰器。但不是用于确定内部函数的值。
如果您想要在多个地方重复使用的代码块,只需将其作为单独的功能,可能在实用程序文件中,然后导入功能。例如:
# myapps.utilities.py
from models import Love
def computeLove(request):
# code for determining value here
return LoveValue
# someView.py
from myapps.utilities import computeLove
def showRatings(request):
lv = computeLove(request)
这是一种标准的编程方法,你真的不需要任何特定的Django功能。
答案 1 :(得分:1)
好的,可能你需要别的东西,但在你的情况下,你可以使用模板标签做这件事,例如:
在appname / util.py中,您必须编写将返回所需数据的代码部分。 然后在模板标签中执行类似的操作# appname_tags.py
from django import template
from appname.util import get_rating
register = template.Library()
@register.simple_tag
def user_rating(user):
rating = get_rating(user)
return rating if rating is not None else ''
所以在模板文件中:
{% load appname_tags %}
{% user_rating anyuser %}
答案 2 :(得分:0)
为此,写Template Context Processor或Template Tag是最佳方法。