Django 笔记之 Form 表单

旧巷老猫 提交于 2019-11-29 05:01:02

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}}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!