[django]Manipulator解惑

代碼下載:/Files/maplye/django/Study914.rar

Manipulator英語翻譯成“操縱器”,你可以用它來創建,修改,驗證你的一個實體對象,並結合FormWrapper可以自動生成頁面上Html代碼(注:FormWrapper是用來生成html代碼,Manipulator使爲FormWrapper提供數據和數據模型等)。
 
django系統已經帶有兩種Manipulator,一是AddManipulator,二是ChangeManipulator,我以前一直以爲這是model的兩個方法,還有ChangeManipulator我以爲是爲我的model更換一個Manipulator,其實他是兩個不同的類。這兩個類能夠自動根據model來生成validation和save。AddManipulator和ChangeManipulator都是繼承自Manipulator,不同的是ChangeManipulator帶有一objectid的構造參數,並獲取一object賦值給他的original_object屬性,並在save方法使用修改對象,然後保存該對象。
關於這兩種Manipulator的使用,可以參考django document:
 
除了django提供的兩種Manipulator,我們還可以自定義Manipulator,這樣我們定義自己的fields,validation,save等等。
如:
None.giffrom django import forms
None.gif
None.gifurgency_choices 
= (
None.gif    (
1"Extremely urgent"),
None.gif    (
2"Urgent"),
None.gif    (
3"Normal"),
None.gif    (
4"Unimportant"),
None.gif)
None.gif
None.gif
class ContactManipulator(forms.Manipulator):
None.gif    
def __init__(self):
None.gif        self.fields 
= (
None.gif            forms.EmailField(field_name
="from", is_required=True),
None.gif            forms.TextField(field_name
="subject", length=30, maxlength=200, is_required=True),
None.gif            forms.SelectField(field_name
="urgency", choices=urgency_choices),
None.gif            forms.LargeTextField(field_name
="contents", is_required=True),
None.gif        )
None.gif    
def save(self):        #dot.gifdot.gif.

而且我們還可以定義帶有初始化參數的custom Manipulator
如:
None.gifclass ContactManipulator(forms.Manipulator):
None.gif    
def __init__(self,object_id=None):
None.gif        self.object_id 
= object_id
None.gif        self.fields 
= (
None.gif            forms.EmailField(field_name
="fromEmail", is_required=True),
None.gif            forms.TextField(field_name
="subject", length=30, maxlength=200, is_required=True),
None.gif            forms.SelectField(field_name
="urgency", choices=urgency_choices),
None.gif            forms.LargeTextField(field_name
="contents", is_required=True),
None.gif        )
None.gif
None.gif    
def save(self, new_data):
None.gif        fromemail 
= new_data["fromEmail"]
None.gif        subject 
= new_data["subject"]
None.gif        urgency 
= new_data["urgency"]
None.gif        contents 
= new_data["contents"]
None.gif        
if self.object_id:
None.gif            obj 
= Contact.objects.get(pk=int(self.object_id))
None.gif            obj.fromEmail 
= fromemail
None.gif            obj.subject 
= subject
None.gif            obj.urgency 
= urgency;
None.gif            obj.contents 
= contents;
None.gif        
else:
None.gif            obj 
= Contact(fromEmail=fromemail, subject=subject, urgency=urgency,contents=contents)
None.gif        obj.save()
你看上面ContactManipulator的Manipulator就具有AddManipulator和ChangeManipulator兩個的功能,
那這個ContactManipulator應該怎麼用呢
None.gif#創建   
None.gif
def contact_form(request):
None.gif    manipulator 
= ContactManipulator()
None.gif    
if request.POST:
None.gif        new_data 
= request.POST.copy()
None.gif        errors 
= manipulator.get_validation_errors(new_data)
None.gif        
if not errors:
None.gif            manipulator.do_html2python(new_data)
None.gif
None.gif            manipulator.save(new_data)
None.gif            
return HttpResponseRedirect("/formapp/contact/")
None.gif    
else:
None.gif        errors 
= new_data = {}
None.gif        
None.gif    form 
= forms.FormWrapper(manipulator, new_data, errors)
None.gif    
return render_to_response('places/contact_form.html', {'form': form})
None.gif
None.gif
#修改
None.gif
def editcontact(request,contactid):
None.gif    manipulator 
= ContactManipulator(contactid)
None.gif    
None.gif    
if request.POST:
None.gif        new_data 
= request.POST.copy()
None.gif        errors 
= manipulator.get_validation_errors(new_data)
None.gif        
if not errors:
None.gif            manipulator.do_html2python(new_data)
None.gif            manipulator.save(new_data)
None.gif
None.gif            
# Do a post-after-redirect so that reload works, etc.
None.gif
            return HttpResponseRedirect("/formapp/contact/1")
None.gif    
else:
None.gif        errors 
= {}        
None.gif        contact 
= Contact.objects.get(id = contactid)
None.gif        new_data 
= contact.__dict__
None.gif    
None.gif    form 
= forms.FormWrapper(manipulator, new_data,errors )
None.gif    
return render_to_response('places/contact_form.html', {'form': form})        
None.gif

以上是我在學習Manipulator時一些個人理解,暫時記錄如此,以後我會更深入的瞭解他們,同時非常感謝limodou的解惑,他真是個熱心人,向他學習!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章