我遇到了这段代码:
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
,但我仍感到困惑。你能否解释一下这两行是什么意思以及它们的目的是什么?
感谢
答案 0 :(得分:8)
exclude
属性告诉Django模型不中的哪些字段要包含在表单中。
引用模型表单文档的Selecting fields to use部分:
2。将
exclude
的内部Meta类的ModelForm
属性设置为要从表单中排除的字段列表。
model
行只是告诉Django从哪个模型中取出字段;这两行一起告诉Django根据RegistrationForm
模型上的所有字段提供Drinker
字段,'user'
除外。对于给定的Drinker
模型,即birthday
和name
。
这些字段将添加到表单上已定义的其他表单字段中。如果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',)
- 表示仅显示电子邮件字段和用户字段