Django表单

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django表单相关的知识,希望对你有一定的参考价值。

1.构建一个Django表单的步骤:

(1)定义一个Form类

#forms.py

from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label=‘Your name‘, max_length=100)

(2)定义一个视图函数 

#views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import NameForm

def get_name(request):    
    if request.method == ‘POST‘:
        #如果表单提交的是POST请求,视图将创建一个表单实例
#并使用请求中的数据填充它(即绑定数据至表单) form = NameForm(request.POST)
if form.is_valid(): # process the data in form.cleaned_data as required # ... # redirect to a new URL: return HttpResponseRedirect(‘/thanks/‘) #如果访问视图的是一个GET请求,它将创建一个空的表单实例并将它放置到要渲染的模板的上下文中。
#这是我们在第一次访问该URL时预期发生的情况。 else: form = NameForm() #如果之前的表单验证没通过,也将使用绑定数据的表单重新渲染模板。 return render(request, ‘name.html‘, {‘form‘: form})

Form 的实例具有一个is_valid() 方法,它为所有的字段运行验证的程序。当调用这个方法时,如果所有的字段都包含合法的数据,它将:

  • 返回True
  • 将表单的数据放到cleaned_data 属性中。

(3)定义一个视图模板

<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
</form>
  • Django 原生使用“csrf_token” 模板标签支持简单易用的跨站请求伪造的防护
  • 如果你的表单包含URLFieldEmailField 或其它整数字段类型,Django 将使用urlemailnumber 这样的HTML5 输入类型。默认情况下,浏览器可能会对这些字段进行它们自身的验证,这些验证可能比Django 的验证更严格。如果想禁用这个行为,设置form 标签的novalidate 属性,或者指定一个不同的字段,如TextInput

2.表单字段

  • 每个表单字段都有一个对应的Widget 类,它对应一个HTML 表单Widget,例如<input type="text">在大部分情况下,字段都具有一个合理的默认Widget。例如,默认情况下,CharField 具有一个TextInput Widget,它在HTML 中生成一个<input type="text">如果你需要<textarea>,在定义表单字段时你应该指定一个合适的Widget,例如 message = forms.CharField(widget=forms.Textarea)

3.表单数据

  • 验证后的表单数据将位于form.cleaned_data 字典中。这些数据已经转换好为Python 的类型。
if form.is_valid():
    subject = form.cleaned_data[‘subject‘]
    message = form.cleaned_data[‘message‘]
    sender = form.cleaned_data[‘sender‘]

4.表单模板

  • {{form.as_table}} 以表格的形式将它们渲染在<tr> 标签中;{{ form.as_p }}  将它们渲染在<p> 标签中;{{ form.as_ul }} 将它们渲染在<li> 标签中。注意,必须自己提供<table><ul> 元素。 

 

以上是关于Django表单的主要内容,如果未能解决你的问题,请参考以下文章

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

Django - 保存表单的位置

SpringBoot中表单提交报错“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“(代码片段

如何将 django 表单字段属性插入 HTML 代码?

Django - AJAX - 如何提交多个表单?