一、Form
設計一張普通model表:
class UserInfo(models.Model): name = models.CharField(verbose_name='員工姓名', max_length=16) username = models.CharField(verbose_name='用戶名', max_length=32) password = models.CharField(verbose_name='密碼', max_length=64) email = models.EmailField(verbose_name='郵箱', max_length=64) depart = models.ForeignKey(verbose_name='部門', to="Department")
現在我們將這個表 繼承form:
class UserInfoForm(Form): name = fields.CharField(required=True,error_messages={'required':'用戶名不能為空'}) email = fields.EmailField(required=True)
生成了form以后,我們可以在前端直接使用form類的實例。form幫我們生成了標簽,然后再前端進行渲染。
那么問題就來了,如果我想給model表中的depart生成一個下拉框,該如何使用form進行生成呢?
容易想到的就是 如下:
class UserInfoForm(Form): name = fields.CharField(required=True,error_messages={'required':'用戶名不能為空'}) email = fields.EmailField(required=True) depart = fields.ChoiceField(choices=Department.object.value_list('id','title'))
但是上面存在一個問題,那就是新添加的數據無法在頁面上顯示出來,只有當項目重啟之后,才會顯示最新添加的結果。我們來分析一下原因:
我們知道,類中,除了方法或函數以外,在程序執行過程中,類也會執行,也就是說,當執行到UserInForm類的時候,會依次進行實例化name,email,depart這三個變量,注意,當實例化depart變量的時候,會進行數據庫操作,也就是說,只要程序不重啟,這個取出數據永遠只是第一次程序期啟動時取出的數據。既然,我們發現了問題,那么就有兩種結局措施。
Solution 1:
from django.forms import Form from django.forms import fields from django.forms import widgets from django.forms.models import ModelChoiceField from app01 import models class UserInfoForm(Form): name = fields.CharField(required=True,error_messages={'required':'用戶名不能為空'}) email = fields.EmailField(required=True) part = fields.ChoiceField()
def __init__(self,*args,**kwargs): super(UserInfoForm,self).__init__(*args,**kwargs) self.fields['part'].choices = models.Department.objects.values_list('id','title')
延遲取數據操作,也就是說,取數據每次發生在實例化的時候!
Solutiion 2:
from django.forms import Form from django.forms import fields from django.forms import widgets from django.forms.models import ModelChoiceField from app01 import models class UserInfoForm(Form): name = fields.CharField(required=True,error_messages={'required':'用戶名不能為空'}) email = fields.EmailField(required=True) part = ModelChoiceField(queryset=models.Department.objects.all())
用內置的ModelChoiceField來進行實例化,這個實例化過程與上面的兩步是等價!
二、Form字段類型補充
1、內置Form可選類型
BooleanField CharField(maxlength) ChoiceField TypedChoiceField DateField/DateTimeField(auto_now,auto_now_add)
DecimalField DurationField EmailField FileField(upload_to) FilePathField FloatField(max_digits,decimal_places)
ImageField(upload_to) IntegerField GenericIPAddressField MultipleChoiceField TypedMultipleChoiceField
NullBooleanField RegexField SlugField TimeField URLField UUIDField MultiValueField SplitDateTimeField
ModelChoiceField ModelMultipleChoiceField
2.可選屬性
required # 取消必填 如:forms.CharField(required=False) label #取消默認名稱 如:forms.CharField(label='Your name') initial # 給標簽賦初值 如:url = forms.URLField(initial='http://') import datetime day = forms.DateField(initial=datetime.date.today)
widget#給標簽添加屬性 如:comment = forms.CharField(widget=forms.Textarea) #將默認的input框變為textarea help_text#添加提示信息 如sender = forms.EmailField(help_text='A valid email address, please.') error_messages#name = forms.CharField(error_messages={'required': 'Please enter your name'})