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

eag*_*arn 6 python django metaclass django-models

我遇到了这段代码:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

model=Drinker
exclude=('user`,)
Run Code Online (Sandbox Code Playgroud)

我对这项meta class工作的理解不太清楚.我看过了,documentation但我仍然感到困惑.你能否解释一下这两行是什么意思以及它们的目的是什么?谢谢

Mar*_*ers 8

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

引用选择字段以使用模型表单文档的部分:

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

model线只是告诉Django从哪个模型中取出字段; 两条线一起告诉Django RegistrationForm根据Drinker模型上的所有字段给出字段,除了'user'.对于给定的Drinker模型,那是birthdayname.

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

请参阅覆盖同一章的默认字段部分:

当您明确地实例化这样的表单字段时,了解如何ModelForm和常规Form相关是很重要的.

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

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

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

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

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