[英]what does exclude in the meta class of django mean?
我遇到了這段代碼:
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
但我仍感到困惑。 你能否解釋一下這兩行是什么意思以及它們的目的是什么? 謝謝
exclude
屬性告訴Django模型中哪些字段不包含在表單中。
引用選擇字段以使用模型表單文檔的部分:
2.將
ModelForm
的內部Meta類的exclude
屬性設置為要從表單中排除的字段列表。
model
線簡單地告訴Django從哪個模型中取出字段; 兩條線一起告訴Django基於Drinker
模型上的所有字段給出RegistrationForm
字段,除了'user'
。 對於給定的Drinker
模型,那是birthday
和name
。
這些字段將添加到表單上已定義的其他表單字段中。 如果Drinker
模型獲得了更多字段,那么這些字段也將自動成為表單的一部分。
當您明確地實例化這樣的表單字段時,了解
ModelForm
和常規Form
的關聯方式非常重要。
ModelForm
是一個可以自動生成某些字段的常規Form
。 自動生成的字段取決於Meta
類的內容以及已經以聲明方式定義的字段。 基本上,ModelForm
只會生成表單中缺少的字段,換句話說,生成的字段沒有以聲明方式定義。
內部的Meta
類只是在表單類上為這樣的配置創建名稱空間的便捷方式,供Django框架查找。 所有Django現在要做的就是內省Form.Meta
,看看那里定義了什么屬性。
請注意,使用exclude
可能會導致安全問題。 來自同一文件:
強烈建議您使用fields屬性顯式設置應在表單中編輯的所有字段。 當表單意外地允許用戶設置某些字段時,特別是當新字段添加到模型時,如果不這樣做很容易導致安全問題。 根據表單的呈現方式,問題甚至可能在網頁上不可見。
替代方法是自動包括所有字段,或僅將一些字段列入黑名單。 眾所周知,這種基本方法的安全性較低,並導致主要網站(例如GitHub )的嚴重漏洞。
簡而言之:您希望在表單中顯示的字段應在'fields'屬性ex中提及:
fields = '__all__' #will show all the fields from the model in the form
'排除'恰恰相反
exclude = ['title'] # don't show the title field
fields = exclude() and fields = '__all__'
- 表示顯示所有字段
exclude = ('password',)
- 表示排除密碼字段
fields = ('user','email',)
- 表示僅顯示電子郵件字段和用戶字段
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.