1. 程式人生 > >Django Form補充

Django Form補充

ima input框 輸入框 ces choices 推薦 父類 mpat rms

我們寫完項目後,當發現某個輸入框是input框,把它更換為select框更合適時,這時我們可以通過Django Form 便捷的更改其為select框。 重寫模型類的某個字段,即會重寫其構造。 URL:

from django.conf.urls import url
from app01 import views

urlpatterns = [

    url(r‘^aaa/‘, views.aaa),

]

models:

class Department(models.Model):
    """
    部門表
    """
    title = models.CharField(verbose_name=‘部門名稱‘, max_length=16)

    def __str__(self):
        return self.title


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")


    def __str__(self):
        return self.name

views:

from django.forms import Form, fields, widgets
from app01 import models
from django.forms.models import ModelChoiceField
from django.shortcuts import render


class UserInfoForm(Form):
    name = fields.CharField(required=True, error_messages={‘required‘: ‘用戶名不為空‘})
    email = fields.EmailField(required=True)

    part = fields.ChoiceField()
    # user_type = ModelChoiceField(queryset=models.Department.objects.all())

    def __init__(self,*args,**kwargs):
        super(UserInfoForm,self).__init__(*args,**kwargs)
        self.fields[‘part‘].choices=models.Department.objects.values_list(‘id‘,‘title‘)


def aaa(request):
    if request.method == "GET":
        form = UserInfoForm()
        return render(request, ‘aaa.html‘, {‘form‘: form})

templates:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
<form>
    {% csrf_token %}
    {{ form.as_p }}
</form>
</body>
</html>

值得註意的點:

user_type = ModelChoiceField(queryset=models.Department.objects.all())

通過這種方式實現頁面顯示user_type字段的select框,但是需要註意這種方式依賴類的__str__方法。

技術分享  技術分享

所以,推薦使用下面這種方式:

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‘)

技術分享

另外,我們可能還會這樣寫:

part = fields.ChoiceField(choices = models.Department.objects.values_list(‘id‘, ‘title‘))

一行代碼搞定的事,為什麽要寫四行代碼? 事實上,當我們新增一個部門時,這一行代碼就會暴露出他的問題:頁面上顯示的還是增加前的部門。 那麽怎麽解決呢?

繼承父類__init__方法即可搞定。因為每發一次請求,就會執行視圖函數的form = UserInfoForm()這行代碼,即實例化UserInfoForm類生成一個對象,這將自動執行類的__init__方法,來保證從數據庫獲取最新的數據。

Django Form補充