从Model类中生成的formset,每个表具有一下属性。---> formset从views post到UI.
for form in formset:
for fiel in form:
fiel.as_hidden fiel.auto_id fiel.field fiel.html_initial_name fiel.label
fiel.as_text fiel.css_classes fiel.form fiel.html_name fiel.label_tag
fiel.as_textarea fiel.data fiel.help_text fiel.id_for_label fiel.name
fiel.as_widget fiel.errors fiel.html_initial_id fiel.is_hidden fiel.value
view.py 中自定义表单的时候, required=False用来指定是否可选填。widget=forms.Textarea,可以指定对应的form显示格式。
from django import forms
class ContactForm(forms.Form):
subject =forms.CharField()
email =forms.EmailField(required=False,label='Youre-mail address)#邮箱为选填项,其他为默认必填项。同时label用于替换verbose_name提示标签信息。
message =forms.CharField(widget=forms.Textarea)#CharField默认为inputtype=text,修改为显示<Textarea>
defclean_message(self):#自定义表单验证.
message = self.cleaned_data['message']
num_words = len(message.split())
if num_words < 4:
raiseforms.ValidationError("Not enough words!")
return message
initial 用来给表单填写默认值。
re_form = ContaceForm(
initial={'subject': 'I love yoursite!'}
)
html中的容错块,放在form上面即可
{% if form.errors %}
<p style="color:red;">
Please correct the error{{form.errors|pluralize }} below.
</p>
{% endif %}
css渲染:错误列表
<ulclass=”errorlist”>
<style type="text/css">
ul.errorlist {
margin: 0;
padding: 0;
}
.errorlist li {
background-color: red;
color: white;
display: block;
font-size: 10px;
margin: 0 0 3px;
padding: 4px 5px;
}
</style>
虽然,自动生成HTML是很方便的,但是在某些时候,你会想覆盖默认的显示。{{form.as_table}}和其它的方法在开发的时候是一个快捷的方式,form的显示方式也可以在form中被方便地重写。
每一个字段部件(<input type=”text”>,<select>,<textarea>,或者类似)都可以通过访问{{form.字段名}}进行单独的渲染。
<head><title>Contactus</title></head><body><h1>Contactus</h1> {% if form.errors %}<p style="color: red;"> Pleasecorrect the error{{ form.errors|pluralize }} below.</p> {% endif %} <formaction="" method="post"> <divclass="field"> {{ form.subject.errors }}<labelfor="id_subject">Subject:</label>{{ form.subject }} </div><div class="field"> {{form.email.errors }} <labelfor="id_email">Your e-mailaddress:</label> {{ form.email }}</div> <divclass="field"> {{ form.message.errors }}<labelfor="id_message">Message:</label>{{ form.message }} </div><input type="submit" value="Submit"></form></body></html>
{{ form.message.errors}} 会在 <ulclass="errorlist">里面显示,如果字段是合法的,或者form没有被绑定,就显示一个空字符串。 我们还可以把form.message.errors 当作一个布尔值或者当它是list在上面做迭代,例如:
<divclass="field{% if form.message.errors %} errors{% endif%}">
{% if form.message.errors %}<ul> {% for error inform.message.errors %}<li><strong>{{error}}</strong></li>{% endfor %} </ul> {% endif %}<labelfor="id_message">Message:</label>{{ form.message }} </div>
在校验失败的情况下,这段代码会在包含错误字段的div的class属性中增加一个”errors”,在一个有序列表中显示错误信息。
urls.py 配置文件可以这样写:
旧的:
from django.conf.urls.defaults import*
urlpatterns = patterns('',
(r'^hello/$','mysite.views.hello'),
(r'^time/$','mysite.views.current_datetime'),
(r'^time/plus/(\d{1,2})/$','mysite.views.hours_ahead'),
(r'^tag/(\w+)/$','weblog.views.tag'),
)
新的:urlpatterns是可以叠加的。from django.conf.urls.defaults import*
urlpatterns =patterns('mysite.views',
(r'^hello/$','hello'),
(r'^time/$','current_datetime'),
(r'^time/plus/(\d{1,2})/$','hours_ahead'),
(r'^articles/(\d{4})/(\d{2})/$',views.month_archive),#1
(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$',views.month_archive),#2
(r'^mydata/birthday/$', views.my_view, {'month':'jan', 'day': '06'}),#3 访问/mydata/birthday/等价于访问/mydata/2013/06/
(r'^mydata/(?P<month>\w{3})/(?P<day>\d\d)/$',views.my_view),#4
)
urlpatterns +=patterns('weblog.views',
(r'^tag/(\w+)/$','tag'),
)
url 访问模式
假设访问localhost:8000/articles/2013/06
#1 相当于函数调用--> month_archive(request,'2013', '06')
#2 相当于函数调用--> month_archive(request,year='2013', month='06')
有时你会发现你写的视图函数是十分类似的,只有一点点的不同。比如说,你有两个视图,它们的内容是一致的,除了它们所用的模板不太一样:# urls.py
from django.conf.urls.defaults import*
from mysite import views
urlpatterns = patterns('',
(r'^foo/$', views.foo_view),
(r'^bar/$', views.bar_view),
)
# views.py
from django.shortcuts importrender_to_response
from mysite.modelsimport MyModel
deffoo_view(request):
m_list =MyModel.objects.filter(is_new=True)
returnrender_to_response('template1.html', {'m_list':m_list})
defbar_view(request):
m_list =MyModel.objects.filter(is_new=True)
return render_to_response('template2.html',{'m_list':m_list})
可以如下改进: # urls.py
from django.conf.urls.defaults import * from mysite import viewsurlpatterns = patterns('', (r'^foo/$', views.foobar_view,{'template_name': 'foo.html'}), (r'^bar/$', views.foobar_view,{'template_name': 'bar.html'}), ) # views.py from django.shortcutsimport render_to_response from mysite.models import MyModel deffoobar_view(request, template_name): m_list =MyModel.objects.filter(is_new=True) returnrender_to_response(template_name, {'m_list': m_list})
URLconf指定了 template_name ,视图函数会把它当成一个参数。#3 #4 -- >访问/mydata/birthday/ ,等价于访问 /mydata/jan/06/
抽取出我们代码中共性的东西是一个很好的编程习惯。 比如,像以下的两个Python函数:
def say_hello(person_name):
print 'Hello, %s' %person_name
def say_goodbye(person_name):
print 'Goodbye, %s' %person_name
我们可以把问候语提取出来变成一个参数:
def greet(person_name, greeting):
print '%s, %s' %(greeting, person_name)
# urls.py
from django.conf.urls.defaults import * from mysite import viewsurlpatterns = patterns('', (r'^events/$', views.event_list),(r'^blog/entries/$', views.entry_list), ) # views.py fromdjango.shortcuts import render_to_response from mysite.modelsimport Event, BlogEntry def event_list(request): obj_list =Event.objects.all() returnrender_to_response('mysite/event_list.html', {'event_list':obj_list}) def entry_list(request): obj_list =BlogEntry.objects.all() returnrender_to_response('mysite/blogentry_list.html', {'entry_list':obj_list})
在重构以后:
# urls.py
from django.conf.urls.defaults import*
from mysite import models, views url
patterns = patterns('',
(r'^events/$', views.object_list, {'model': models.Event}),(r'^blog/entries/$', views.object_list, {'model':models.BlogEntry}),
)
# views.py
from django.shortcuts importrender_to_response
def object_list(request,model):
obj_list = model.objects.all()
template_name ='mysite/%s_list.html' %model.__name__.lower()
return render_to_response(template_name,{'object_list':obj_list})
<pre class="cn literal-block" id="cn146"style="padding: 0.3em 0.4em; font-size: 12px; background-color:rgb(224, 255, 184); border-style: solid; border-color: rgb(148,218, 58); border-width: 1px 0px; overflow: hidden; width: 682px;color: rgb(35, 79, 50); position: relative; line-height: 18px;font-family: Anonymous, Consolas, 'Courier New'!important;">代码块</pre>