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
但我仍然感到困惑.你能否解释一下这两行是什么意思以及它们的目的是什么?谢谢
该exclude
属性告诉Django模型中哪些字段不包含在表单中.
引用选择字段以使用模型表单文档的部分:
2.将内部Meta类的
exclude
属性设置为ModelForm
要从表单中排除的字段列表.
该model
线只是告诉Django从哪个模型中取出字段; 两条线一起告诉Django RegistrationForm
根据Drinker
模型上的所有字段给出字段,除了'user'
.对于给定的Drinker
模型,那是birthday
和name
.
这些字段将添加到表单上已定义的其他表单字段中.如果Drinker
模型获得了更多字段,那么这些字段也会自动成为表单的一部分.
当您明确地实例化这样的表单字段时,了解如何
ModelForm
和常规Form
相关是很重要的.
ModelForm
是一个Form
可以自动生成某些字段的常规字符.自动生成的字段取决于Meta
类的内容以及已经以声明方式定义的字段.基本上,ModelForm
只生成表单中缺少的字段,换句话说,生成未以声明方式定义的字段.
内部Meta
类只是在表单类上为此类配置创建命名空间以便Django框架查找的便捷方法.所有Django现在要做的就是内省Form.Meta
,看看那里定义了哪些属性.
请注意,使用exclude
可能会导致安全问题.来自同一文件:
强烈建议您使用fields属性显式设置应在表单中编辑的所有字段.当表单意外地允许用户设置某些字段时,特别是当新字段添加到模型时,如果不这样做很容易导致安全问题.根据表单的呈现方式,问题甚至可能在网页上不可见.
替代方法是自动包括所有字段,或仅将一些字段列入黑名单.众所周知,这种基本方法的安全性较低,并导致主要网站(例如GitHub)的严重漏洞.
归档时间: |
|
查看次数: |
4309 次 |
最近记录: |