Django模板中{{ form }}表示表单实例的原因及自定义变量名方法
Django模板表单变量相关问题解答
为什么模板文件中的{{ form }}代表一个表单实例?
Django模板的变量取值完全和传入的上下文字典的键一一对应,不存在强制命名为form的内置全局变量。你看到的{{ form }}可以直接渲染表单,是因为开发者将表单实例以form为键传入了模板上下文,同时Django的表单类内置实现了模板渲染的字符串输出逻辑,被模板调用时会自动生成对应的<label>和<input>元素。
官方说明逻辑为:要将表单渲染到模板中,仅需将表单实例放入模板上下文即可。如果你的表单在上下文中被命名为form,
{{ form }}就会正确渲染其对应的<label>和<input>元素。
模板上下文里的form变量是在哪里定义的?
没有全局统一的定义位置,所有模板上下文中的form变量都是在视图层传入的,常见的传入场景分为两类:
- 基于函数的视图(FBV)中,是开发者渲染模板时手动加入上下文字典的,示例代码如下:
from django.shortcuts import render from .forms import YourCustomForm def your_view(request): form = YourCustomForm(request.POST or None) # 上下文字典的键'form'对应模板中的{{ form }}变量 return render(request, 'your_template.html', {'form': form})
- 基于类的视图(CBV)中,比如
FormView、CreateView这类内置的表单相关视图,会默认将表单实例以form为键注入上下文,这个逻辑是在FormMixin的get_context_data方法中实现的。
如何修改变量名,使用{{ my_form }}渲染表单?
只需修改传入模板上下文的键名即可,对应不同视图类型的修改方式如下:
函数视图修改方式
直接修改上下文字典的键名即可:
# 将原来的键'form'改为'my_form' return render(request, 'your_template.html', {'my_form': form})
类视图修改方式
重写get_context_data方法修改键名:
from django.views.generic import FormView from .forms import YourCustomForm class YourFormView(FormView): form_class = YourCustomForm template_name = 'your_template.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 将默认的'form'键值转移到新键'my_form',可选删除原'form'键 context['my_form'] = context.pop('form') return context
修改完成后,即可在模板中直接使用{{ my_form }}渲染表单,效果和原{{ form }}完全一致。
内容的提问来源于stack exchange,提问作者Yan Tian
相关产品推荐
相关产品推荐

