2016-09-13 40 views
1
from django import forms 
from .models import NewsSignUp 

class NewsSignUpForm(forms.ModelForm): 
    class Meta: 
     model = NewsSignUp 
     fields = ['email', 'first_name'] 
here 

此代码工作得很好。但是,当我删除“类元:”如下,它抛出一个ValueError说为什么在创建模型表单时需要“类Meta”?

from django import forms 
from .models import NewsSignUp 

class NewsSignUpForm(forms.ModelForm): 
    model = NewsSignUp 
    fields = ['email', 'first_name'] 

是否有人可以给个说法“的ModelForm已没有指定模型类。”? :(

+0

This [post](http://stackoverflow.com/questions/10344197/how-does-djangos-meta-class-work)解释更好 – kt14

+0

@ kt14实际上是不一样的:这是专注于从模型,而关联的问题更多的是关于模型定义中的元数据。我发现,两者在Django中如何使用'Meta'是互补的,基本上不重叠。 – neuronet

回答

4

您正在创建一个ModelForm子类。模型的形式有一个模型,从工作,并且Meta对象配置此。

配置这样的分组到Meta类避免名称冲突。这样你可以有一个model在形式不与配置干扰换句话说,通过使用class Meta:你得到一个嵌套的命名空间中使用只是配置ModelForm相对于该型号。

然后(Meta之外)ModelForm类体本身的命名空间保留给表单域自身以及表单域方法。您通常只需让ModelForm从您的模型中生成这些字段,但原则上,您可以将字段添加到字段中。将字段放入类中的另一个原因是用您自己的版本完全替换任何生成的字段。

Model Forms documentation

ModelForm是一个普通Form能够自动生成的某些字段。自动生成的字段取决于Meta类的内容以及哪些字段已被声明性定义。基本上,ModelForm只会生成表单中缺少的字段,换句话说,没有声明性定义的字段。声明性地定义

域被保持原样,因此任何定制到Meta属性如widgetslabelshelp_texts,或error_messages被忽略制成;这些仅适用于自动生成的字段。

因为ModelForm预计该配置下的Meta名称进行设置,你不能只是删除,并把modelfieldsModelForm类本身;那只是错误的地方。

+0

谢谢Fella! :) – Utkarsh

相关问题