Form 表单怎么使用
是什么?
在 HTML 中,form 就是 … 里面的元素,用来和后台交互;
在 Django 中,form是一个丰富的框架,来促进表单的创建和表单数据的操作。
Django 的 Form 主要做了三项工作:
- 准备和重构数据提供给前端
- 给这些数据生成 html 表单
- 接受和处理客户端返回的表单
Django 初始化表单,可以空着也可以预填充:
- 用模型的实例预填充
- 其他来源数据
- 从之前提交的 HTML 表单
怎么用?
Form 只有 GET 和 POST 两种 HTTP 方法。
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='Your name', max_length=100)
forms.Field 和 models.Field 类似
Form 实例 都有一个 is_valid() 方法;如果所有的域都有合法的数据,返回 True;并把表单数据放到 cleaned_data 属性里。
如何在视图里使用Form:
POST 实例化 Form:
form = NameForm(request.POST)
GET 实例化 Form:
form = NameForm()
如何在模板里使用Form:
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }}
{{ field }}{
% if field.help_text %}
<p class="help">{{ field.help_text|safe }}</p>
{% endif %}
</div>
{% endfor %}
如何创建表单集?
使用 formset_factory 工厂方法
from django.forms import formset_factory
ArticleFormSet = formset_factory(ArticleForm, extra=2,can_order=True)
表单集是可迭代的,extra 表示另外的多出的,can_order 表示可以排序,can_delete, 表示可以删除;
如何用参数初始化表单集?
formset = ArticleFormSet(initial=[
{'title': 'Django is now open source','
pub_date': datetime.date.today(),}
])
只初始化了一个表单,有多少字典初始化多少个。
如何在视图里使用表单集?
def manage_articles(request):
ArticleFormSet = formset_factory(ArticleForm)
if request.method == 'POST':
formset = ArticleFormSet(request.POST, request.FILES)
if formset.is_valid():
# do something with the formset.cleaned_data
pass
else:
formset = ArticleFormSet()
return render(request, 'manage_articles.html', {'formset': formset})
如何在模板里使用表单集?
<form method="post">
{{ formset.management_form }}
<table>
{% for form in formset %}
{{ form }}
{% if formset.can_delete %}
<li>{{ form.DELETE }}</li>
{% endif %}
{% endfor %}
</table>
</form>
直接使用 Form 来操作 Model,使用 ModelForm 可以节省大量时间,精力和代码。
如何使用 ModelForm?
from django.forms import ModelForm
from myapp.models import Article
class ArticleForm(ModelForm):
class Meta:
model=Article
fields = ['pub_date','headline','content','reporter']
如何在视图里使用?
添加文章:
form = ArticleForm()
修改文章:
article = Article.objects.get(pk=1)
form = ArticleForm(instance=article)
从提交的表单数据创建模型实例保存?
新实例:
f = ArticleForm(request.POST)
new_article = f.save()
修改实例:
a = Article.objects.get(pk=1)
f = ArticleForm(request.POST, instance=a)
f.save()
从提交的表单数据,和其他的数据创建模型实例并保存?
f = AuthorForm(request.POST)
new_author = f.save(commit=False)
new_author.some_field = 'some_value'
new_author.save()
f.save_m2m()
save_m2m() 只有在 save(commit=False)要用.
当使用 save() 就不需要。
选择需要的表单域?
fields = ‘__all__’
exclude = ['title']
给表单域默认值?
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
user = self.request.user
kwargs.update(
{'initial': {'user': user}}
)
return kwargs
在模板中隐藏表单域?
{{form.field.as_hidden}}
在模板中使得某表单域不能编辑
{{form.field.disabled}}