Form與ModelForm-下拉框或者多選注意//及字段補充


一、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'})

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM