zoukankan      html  css  js  c++  java
  • [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等等。
    如:
    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的解惑,他真是个热心人,向他学习!
  • 相关阅读:
    php(ThinkPHP)实现微信小程序的登录过程
    路由器OpenWrt如何脱机(离线)下载BT文件
    OPENWRT X86 安装使用教程 (未完成)
    openwrt l7过滤qos配置
    Ushare应用
    脱机BT transmission
    js实现编码,解码
    波尔远程控制软件与网络人远程控制软件大比拼
    baike并行计算概念
    开机启动tomcat
  • 原文地址:https://www.cnblogs.com/maplye/p/504090.html
Copyright © 2011-2022 走看看