[django]Manipulator解惑

來源:互聯網
上載者:User
代碼下載:/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:http://www.djangoproject.com/documentation/forms/ 除了django提供的兩種Manipulator,我們還可以自訂Manipulator,這樣我們定義自己的fields,validation,save等等。如:from django import forms

urgency_choices = (
    (1, "Extremely urgent"),
    (2, "Urgent"),
    (3, "Normal"),
    (4, "Unimportant"),
)

class ContactManipulator(forms.Manipulator):
    def __init__(self):
        self.fields = (
            forms.EmailField(field_name="from", is_required=True),
            forms.TextField(field_name="subject", length=30, maxlength=200, is_required=True),
            forms.SelectField(field_name="urgency", choices=urgency_choices),
            forms.LargeTextField(field_name="contents", is_required=True),
        )
    def save(self):        #.

而且我們還可以定義帶有初始化參數的custom Manipulator
如:class ContactManipulator(forms.Manipulator):
    def __init__(self,object_id=None):
        self.object_id = object_id
        self.fields = (
            forms.EmailField(field_name="fromEmail", is_required=True),
            forms.TextField(field_name="subject", length=30, maxlength=200, is_required=True),
            forms.SelectField(field_name="urgency", choices=urgency_choices),
            forms.LargeTextField(field_name="contents", is_required=True),
        )

    def save(self, new_data):
        fromemail = new_data["fromEmail"]
        subject = new_data["subject"]
        urgency = new_data["urgency"]
        contents = new_data["contents"]
        if self.object_id:
            obj = Contact.objects.get(pk=int(self.object_id))
            obj.fromEmail = fromemail
            obj.subject = subject
            obj.urgency = urgency;
            obj.contents = contents;
        else:
            obj = Contact(fromEmail=fromemail, subject=subject, urgency=urgency,contents=contents)
        obj.save()

你看上面ContactManipulator的Manipulator就具有AddManipulator和ChangeManipulator兩個的功能,
那這個ContactManipulator應該怎麼用呢#建立   
def contact_form(request):
    manipulator = ContactManipulator()
    if request.POST:
        new_data = request.POST.copy()
        errors = manipulator.get_validation_errors(new_data)
        if not errors:
            manipulator.do_html2python(new_data)

            manipulator.save(new_data)
            return HttpResponseRedirect("/formapp/contact/")
    else:
        errors = new_data = {}
        
    form = forms.FormWrapper(manipulator, new_data, errors)
    return render_to_response('places/contact_form.html', {'form': form})

#修改
def editcontact(request,contactid):
    manipulator = ContactManipulator(contactid)
    
    if request.POST:
        new_data = request.POST.copy()
        errors = manipulator.get_validation_errors(new_data)
        if not errors:
            manipulator.do_html2python(new_data)
            manipulator.save(new_data)

            # Do a post-after-redirect so that reload works, etc.
            return HttpResponseRedirect("/formapp/contact/1")
    else:
        errors = {}        
        contact = Contact.objects.get(id = contactid)
        new_data = contact.__dict__
    
    form = forms.FormWrapper(manipulator, new_data,errors )
    return render_to_response('places/contact_form.html', {'form': form})        

以上是我在學習Manipulator時一些個人理解,暫時記錄如此,以後我會更深入的瞭解他們,同時非常感謝limodou的解惑,他真是個熱心人,向他學習!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.