【原创】 python django…

来源:互联网 发布:陕钢集团网络大学 编辑:程序博客网 时间:2024/05/21 05:05

从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.字段名}}进行单独的渲染。

<html>
<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>
0 0
原创粉丝点击