【问题标题】:what does exclude in the meta class of django mean?django 元类中的 exclude 是什么意思?
【发布时间】:2014-04-18 18:10:41
【问题描述】:

我遇到了这段代码:

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,但我仍然感到困惑。您能否解释一下这两行的含义以及它们的目的是什么? 谢谢

【问题讨论】:

    标签: python django django-models metaclass


    【解决方案1】:

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

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

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

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

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

    参见同一章节的Overriding the default fields部分:

    当您像这样显式实例化表单字段时,了解ModelForm 和常规Form 之间的关系非常重要。

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

    内部Meta 类只是在表单类上为此类配置创建命名空间以供 Django 框架查找的便捷方式。现在 Django 所要做的就是反省 Form.Meta 并查看那里定义了哪些属性。

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

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

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

    【讨论】:

    • together the two lines tell Django to give RegistrationForm fields based on all fields on the Drinker model, except 'user' -- 但我还有其他表单字段,例如电子邮件、密码 1 和密码 2,它们不在 Drinker 中?
    • @eagertoLearn:这些是您添加的显式表单字段; Drinker 字段也会自动添加。如果您在 Drinker 模型上添加更多字段,将来表单也会自动获取这些字段。
    • 但是表单将只有那些在表单中定义的显式字段供用户填写。Drinker 的属性从哪里进入供用户输入?
    • 不,在 Meta 中列出 model = Drinker 会使 ModelForm 添加 birthdayname 条目到您的表单中。
    • @eagertoLearn:表单现在应该有 6 个字段。 4 个在表单上显式创建,2 个来自Drinker
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      简而言之:您想在表单中显示的字段应在“字段”属性中提及:

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

      “排除”则相反

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

      【讨论】:

        猜你喜欢
        • 2013-11-08
        • 2015-09-06
        • 2010-09-29
        • 2018-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-20
        • 1970-01-01
        相关资源
        最近更新 更多