當前位置:編程學習大全網 - 熱門推薦 - 如何正確使用 Django Forms

如何正確使用 Django Forms

1. Django Forms的強大之處

有些django項目並不直接呈現HTML, 二是以API框架的形式存在, 但妳可能沒有想到, 在這些API形式的django項目中也用到了django forms. django forms不僅僅是用來呈現HTML的, 他們最強的地方應該是他們的驗證能力. 下面我們就介紹幾種和Django forms結合使用的模式:

2. 模式壹: ModelForm和默認驗證

最簡單的使用模式便是ModelForm和model中定義的默認驗證方式的組合:

# myapp/views.py

from django.views.generic import CreateView, UpdateView

from braces.views import LoginRequiredMixin

from .models import Article

class ArticleCreateView(LoginRequiredMixin, CreateView):

model = Article

fields = ('title', 'slug', 'review_num')

class ArticleUpdateView(LoginRequiredMixin, UpdateView):

model = Article

fields = ('title', 'slug', 'review_num')

正如以上代碼中看到的壹樣:

ArticleCreateView和ArticleUpdateView中設置model為Article

兩個view都基於Article model自動生成了ModelForm

這些ModelForm的驗證, 是基於Article model中定義的field轉換而來的

3. 模式二, 在ModelForm中修改驗證

在上面的例子中, 如果我們希望每篇article title的開頭都是"new", 那麽應該怎麽做呢? 首先我們需要建立自定義的驗證(validator):

# utils/validator.py

from django.core.exceptions import ValidationError

def validate_begins(value):

if not value.startswith(u'new'):

raise ValidationError(u'Must start with new')

可見, 在django中的驗證程序就是不符合條件便拋出ValidationError的function, 為了方便重復使用, 我們將它們放在django app utils的validators.py中.

接下來, 我們可以在model中加入這些validator, 但為了今後的方便修改和維護, 我們更傾向於加入到ModelForm中:

# myapp/forms.py

from django import forms

from utils.validators import validate_begin

from .models import Article

class ArticleForm(forms.ModelForm):

dev __init__(self, *args, **kwargs):

super(ArticleForm, self).__init__(8args, **kwargs)

self.fields["title"].validators.append(validate_begin)

class Meta:

model = Article

Django的edit views(UpdateView和CreateView等)的默認行為是根據view中model屬性, 自動創建ModelForm. 因此, 我們需要調用我們自己的Modelform來覆蓋自動創建的:

# myapp/views.py

from django.views.generic import CreateView, UpdateView

from braces.views import LoginRequiredMixin

from .models import Article

from .forms import ArticleForm

class ArticleCreateView(LoginRequiredMixin, CreateView):

model = Article

fields = ('title', 'slug', 'review_num')

form_class = ArticleForm

class ArticleUpdateView(LoginRequiredMixin, UpdateView):

model = Article

fields = ('title', 'slug', 'review_num')

form_class = ArticleForm

4. 模式三, 使用form的clean()和clean_<field>()方法

如果我們希望驗證form中的多個field, 或者驗證涉及到已經存在之後的數據, 那麽我們就需要用到form的clean()和clean_<field>&()方法了. 以下代碼檢查密碼長度是否大於7位, 並且password是否和password2相同:

# myapp/forms.py

from django import forms

class MyUserForm(forms.Form):

username = forms.CharField()

password = forms.CharField()

password2 = forms.CharField()

def clean_password(self):

password = self.cleaned_data['password']

if len(password) <= 7:

raise forms.ValidationError("password insecure")

return password

def clean():

cleaned_data = super(MyUserForm, self).clean()

password = cleaned_data.get('password', '')

password2 = cleaned_data.get('password2', '')

if password != password2:

raise forms.ValidationError("passwords not match")

return cleaned_data

其中需要註意的是, clean()和clean_<field>&()的最後必須返回驗證完畢或修改後的值.

5. 模式四, 自定義ModelForm中的field

我們會經常遇到在form中需要修改默認的驗證, 比如壹個model中有許多非必填項, 但為了信息完整, 妳希望這些field在填寫時是必填的:

# myapp/models.py

from django.db import models

class MyUser(models.Model):

username = models.CharField(max_length=100)

password = models.CharField(max_length=100)

address = models.TextField(blank=True)

phone = models.CharField(max_length=100, blank=True)

為了達到以上要求, 妳可能會通過直接增加field改寫ModelForm:

# 請不要這麽做

# myapp/forms.py

from django import forms

from .models import MyUser

class MyUserForm(forms.ModelForm):

# 請不要這麽做

address = forms.CharField(required=True)

# 請不要這麽做

phone = forms.CharField(required=True)

class Meta:

model = MyUser

請不要這麽做, 因為這違反"不重復"的原則, 而且經過多次的拷貝粘貼, 代碼會變得復雜難維護. 正確的方式應當是利用__init__():

# myapp/forms.py

from django import forms

from .models import MyUser

class MyUserForm(forms.ModelForm):

def __init__(self, *args, **kwarg):

super(MyUserForm, self).__init__(*args, **kwargs)

self.fields['address'].required = True

self.fields['phone'].required = True

class Meta:

model = MyUser

值得註意的是, Django forms也是Python類, 類可以繼承和被繼承, 也可以動態修改.

  • 上一篇:植物大戰僵屍修改器風靈月影怎麽用 風靈月影修改器使用教程
  • 下一篇:蘋果MC207 MC240 MB207哪個性價筆高點?
  • copyright 2024編程學習大全網