在django的元类中排除什么意思?

时间:2014-03-13 18:55:21

标签: python django django-models metaclass

我遇到了这段代码:

drinker/models.py:

from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth.models import User

class Drinker(models.Model):
        user            = models.OneToOneField(User)
        birthday        = models.DateField()
        name            = models.CharField(max_length=100)

        def __unicode__(self):
                return self.name

drinker/forms.py:

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from drinker.models import Drinker

class RegistrationForm(ModelForm):
        username        = forms.CharField(label=(u'User Name'))
        email           = forms.EmailField(label=(u'Email Address'))
        password        = forms.CharField(label=(u'Password'), widget=forms.PasswordInput(render_value=False))
        password1       = forms.CharField(label=(u'Verify Password'), widget=forms.PasswordInput(render_value=False))

        class Meta:
                model = Drinker
                exclude = ('user',)

        def clean_username(self):
                username = self.cleaned_data['username']
                try:
                        User.objects.get(username=username)
                except User.DoesNotExist:
                        return username
                raise forms.ValidationError("That username is already taken, please select another.")

        def clean(self):
                if self.cleaned_data['password'] != self.cleaned_data['password1']:
                        raise forms.ValidationError("The passwords did not match.  Please try again.")
                return self.cleaned_data

我的问题是关于内部类元,它有两个属性:

model=Drinker
exclude=('user`,)

我对meta class如何运作有一个不太清楚的理解。我看过documentation,但我仍感到困惑。你能否解释一下这两行是什么意思以及它们的目的是什么? 感谢

3 个答案:

答案 0 :(得分:8)

exclude属性告诉Django模型中的哪些字段要包含在表单中。

引用模型表单文档的Selecting fields to use部分:

  

2。将exclude的内部Meta类的ModelForm属性设置为要从表单中排除的字段列表。

model行只是告诉Django从哪个模型中取出字段;这两行一起告诉Django根据RegistrationForm模型上的所有字段提供Drinker字段,'user'除外。对于给定的Drinker模型,即birthdayname

这些字段将添加到表单上已定义的其他表单字段中。如果Drinker模型获得了更多字段,那么这些字段也会自动成为表单的一部分。

请参阅同章的Overriding the default fields部分:

  

当您明确实例化此类表单字段时,了解ModelForm和常规Form的关联方式非常重要。

     

ModelForm是常规Form,可以自动生成某些字段。自动生成的字段取决于Meta类的内容以及已经以声明方式定义的字段。基本上,ModelForm只会生成表单中缺少的字段,换句话说,就是没有以声明方式定义的字段。

内部Meta类只是在表单类上为此类配置创建命名空间以便Django框架查找的便捷方法。所有Django现在必须做的是内省Form.Meta并查看那里定义的属性。

请注意,使用exclude可能会导致安全问题。来自同一份文件:

  

强烈建议您使用fields属性显式设置应在表单中编辑的所有字段。当表单意外地允许用户设置某些字段时,特别是当新字段添加到模型时,如果不这样做很容易导致安全问题。根据表单的呈现方式,问题可能甚至在网页上都不可见。

     

另一种方法是自动包含所有字段,或仅将一些字段列入黑名单。众所周知,这种基本方法的安全性较低,并导致主要网站上的严重漏洞(例如GitHub)。

答案 1 :(得分:0)

简而言之:您希望在表单中显示的字段应在“字段”属性ex:

中提及
fields = '__all__'  #will show all the fields from the model in the form

'exclude'执行相反的操作

 exclude = ['title'] # don't show the title field

答案 2 :(得分:0)

fields = exclude() and fields = '__all__' - 表示显示所有字段

exclude = ('password',) - 表示排除密码字段

fields = ('user','email',) - 表示仅显示电子邮件字段和用户字段