zoukankan      html  css  js  c++  java
  • forms.ModelForm 与 forms.Form

    1. 首先 两者都是forms里的常用类。

    2. 这两个类在应用上是有区别的。一般情况下,如果要将表单中的数据写入数据库或者修改某些记录的值,就要让表单类继承ModelForm; 如果提交表单后 不会对数据库就行修改,则继承Form类。

    两则的区别可能是,继承了ModelForm,在数据保存的时候 可以这样保存。不需要models.XXX.objects.create(),

    register_form = RegistrationForm(request.POST)
    if register_form.is_valid():
    # 带有前台传的数据的RegistrationForm对象,用new_user.save()直接可以保存,参数意思是不提交数据库,需要后面在提交
    new_user = register_form.save(commit=False)
    new_user.set_password(register_form.cleaned_data['password'])
    new_user.save()

    3. 在实际运用中,出现了一些问题,记录下来,以便日后查看。

    问题一:对继承ModelForm 类的表单初始化值时,报错...

    初始状态:

    # 表单类
    class
    UserInfoForm(forms.ModelForm): company = fields.CharField() school = fields.CharField() phone = fields.CharField() address = fields.CharField() desc = fields.CharField( widget=widgets.Textarea, )
          user_info = UserInfo.objects.get(user=request.user)
    
                user_info_form = UserInfoForm(initial={
                    'school': user_info.school,
                    'company': user_info.company,
                    'phone': user_info.phone,
                    'address': user_info.address,
                    'desc': user_info.desc
                })
    # 在初始化值的时候 出现了错误....
      File "E:django学习okeaccountviews.py", line 90, in personal_data
        'desc': user_info.desc
      File "C:Python35libsite-packagesdjangoformsmodels.py", line 295, in __init__
        raise ValueError('ModelForm has no model class specified.')
    ValueError: ModelForm has no model class specified.
    [08/Apr/2018 19:38:24] "GET /account/personal_data/ HTTP/1.1" 500 79115

    解决办法:

    class UserInfoForm(forms.ModelForm):
        company = fields.CharField()
        school = fields.CharField()
        phone = fields.CharField()
        address = fields.CharField()
        desc = fields.CharField(
            widget=widgets.Textarea,
        )
       
        class Meta:
            model = UserInfo
            fields = ('company', 'school', 'phone', 'address', 'desc')
      # 表单类中需要加model=UserInfo 指向那个models类,及类中的那些字段。

    问题二: 如果fields = ('password', 'email',) 用了两个字段,但在前台展示时,只用到一个如email,那么前台提交时,能否提交??

      答案:不可以,前台需要用几个字段,这里就写几个 如 fields = ( 'email',),  多用到的字段,即使前台不用,提交时,form.is_valid() 也会验证。

    试想,对于  forms.Form 如果表单类 有4个字段 且必填, 如果前台值用到四个,那么想必 form.is_valid() 同样不会通过。待验证...

     4. 对form表单初始化值

    if request.method == 'GET':
            obj = models.ArticlePost.objects.get(id=nid)
            print(obj.column.column)
            form_article_obj = ArticlePostForm(initial={'title': obj.title, 'body': obj.body})  # 初始化input
            form_column_obj = EditArticleColumnForm(initial={'column': obj.column.id})  # 初始化下拉菜单,用id
            columns = models.ArticleColumn.objects.all()
            return render(request, 'article/article_list_edit.html',
                          {'article_form': form_article_obj, 
                           'nid': nid,
                           'column_form': form_column_obj,
                           'columns': columns,
                           'have_column': obj.column
                           })
  • 相关阅读:
    热爱自己的工作
    python 类型转换操作
    使用Python实现Telnet远程登录
    使用Python为程序添加右键菜单打开方式
    【Django实例】序言
    【转】Windows右键菜单设置与应用技巧
    【转】浅谈以太网帧格式
    Beyond Compare脚本:比较文件并生成html格式的差异报告
    【转】C语言中的位域、字节序、比特序、大小端
    【转】tcpdump抓取TCP/IP数据包分析
  • 原文地址:https://www.cnblogs.com/liyqiang/p/8746995.html
Copyright © 2011-2022 走看看