django中form的使用

来源:互联网 发布:全民淘宝客教程视频 编辑:程序博客网 时间:2024/05/21 09:11
所有的form类都是django.forms.Form的子类。
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='Your name', max_length=100)
在HTML页面中使用{{form}}标签展开后显示如下:
<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100" required />
注意:这没有包含<form>标签和submit按钮,需要单独在模板里面添加进去
在views里面的使用方法如下所示:
views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import NameForm
def get_name(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = NameForm()
return render(request, 'name.html', {'form': form})

name.html的内容如下所示:
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>
如果form.is_valid通过的话能够从cleaned_data属性从获得验证过的值。其中cleaned_data是类似python字典的类型,具体见下面例子。下面代码展示了如何通过验证form的值并取出,不过有特殊需求的话也能直接从request.POST中直接取出错误的值。
views.py
from django.core.mail import send_mail
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
recipients = ['info@example.com']
if cc_myself:
recipients.append(sender)
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect('/thanks/')

>>> data = {'subject': 'hello',
... 'message': 'Hi there',
... 'sender': 'foo@example.com',
... 'cc_myself': True}
>>> f = ContactForm(data)
这个创建了一个buond的form,注意:
>>> f = ContactForm({})
>>> f.is_bound
True
传递一个空字典同样也创建一个bound的form。

form也提供了其他html输出的标签:
{{ form.as_table }} 提供了<tr>包围标签
{{ form.as_p }} 提供了<p>包围标签
{{ form.as_ul }} 提供了<li>标签
例如 {{ form.as_p }}展开如下所示:
<p><label for="id_subject">Subject:</label>
<input id="id_subject" type="text" name="subject" maxlength="100" required /></p>
<p><label for="id_message">Message:</label>
<textarea name="message" id="id_message" required></textarea></p>
<p><label for="id_sender">Sender:</label>
<input type="email" name="sender" id="id_sender" required /></p>
<p><label for="id_cc_myself">Cc myself:</label>
<input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>
这里也并没有提供<table>和<ul>标签,需要自己添加进去。

虽然django可以使用{{form}}自动展开,我们同样可以手动控制输出的格式,例如:
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.subject.errors }}
<label for="{{ form.subject.id_for_label }}">Email subject:</label>
{{ form.subject }}
</div>
<div class="fieldWrapper">
{{ form.message.errors }}
<label for="{{ form.message.id_for_label }}">Your message:</label>
{{ form.message }}
</div>
<div class="fieldWrapper">
{{ form.sender.errors }}
<label for="{{ form.sender.id_for_label }}">Your email address:</label>
{{ form.sender }}
</div>
<div class="fieldWrapper">
{{ form.cc_myself.errors }}
<label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label>
{{ form.cc_myself }}
</div>
label标签可以使用label_tag单独生成:
<div class="fieldWrapper">
{{ form.subject.errors }}
{{ form.subject.label_tag }}
{{ form.subject }}
</div>
输入错误格式:
{% if form.subject.errors %}
<ol>
{% for error in form.subject.errors %}
<li><strong>{{ error|escape }}</strong></li>
{% endfor %}
</ol>
{% endif %}

单独处理隐藏标签,比如隐藏标签的错误不需要被显示出来:
{# Include the hidden fields #}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{# Include the visible fields #}
{% for field in form.visible_fields %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
</div>
{% endfor %}
0 0