Python中Django视图函数应该向模板里传实例还是只传需要的属性呢?
这两天在看 Django,有时候有点疑惑,以 Django 官方的教程为例:一个投票的应用,有问题和选项两个 model,问题在选项中有外键,可以通过问题获取到对应的选项,也可以通过选项获取到对应的问题,在渲染模板的时候是应该传对象的实例呢,还是只传用到的实例的某个或多个属性呢?还有就是如果模板用到了问题和选项这两个对象,是分开传还是只传其中一个,然后调用另外一个?
Python中Django视图函数应该向模板里传实例还是只传需要的属性呢?
2 回复
这得看情况。核心原则是:模板里需要什么就传什么,别多传。
如果模板只需要对象的几个属性(比如user.name和user.email),那就传这些属性过去,更干净:
def user_profile(request):
user = request.user
context = {
'username': user.username,
'email': user.email
}
return render(request, 'profile.html', context)
但如果模板里要访问对象的多个属性或方法,或者要用到对象的关系查询,传整个实例更方便:
def post_detail(request, post_id):
post = Post.objects.get(id=post_id)
# 模板里可能需要 post.title、post.content、post.author.name、post.comments.all() 等
return render(request, 'post_detail.html', {'post': post})
简单说:简单需求传属性,复杂展示传实例。
都可以的,只是传 instance 的情况下,注意不要在模板里面产生过多的数据库 query

