簡體   English   中英

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

[英]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模型,那是birthdayname

這些字段將添加到表單上已定義的其他表單字段中。 如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM