Django 笔记之 Form 表单

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值