1. 程式人生 > >Django 表單 (中)-動態實現select效果

Django 表單 (中)-動態實現select效果

django 動態 select

在Django裏面,看看如何通過form來實現一個動態地select下拉框的效果。


首先看看靜態的select的效果

models.py

class city(models.Model):
    name=models.CharField(max_length=32)
    #確保admin裏面顯示的是名字而不是object
    def __str__(self):
        return self.name

admin.py

from django.contrib import admin
from app01.models import city
admin.site.register(city)


然後在admin裏面隨便添加幾條數據

技術分享


views.py

######################## Form #####################
from django import forms
from django.forms import widgets
from django.forms import fields
from app01 import models
from django.forms import ModelChoiceField
class FM(forms.Form):
#這裏使用value_list是因為傳遞給choices的格式剛好是一個列表包括的元組格式
    city3=fields.ChoiceField(
        choices=models.city.objects.all().values_list(‘id‘, ‘name‘),
        widget=widgets.Select
      
    )
    
def fm(request):
    if request.method == "GET":
        obj=FM()
        return render(request,‘fm.html‘,{‘obj‘: obj})

效果如下

技術分享


這個時候,如果我在後臺對city這個表進行了修改,刷新我的頁面,顯示的效果是不會改變的!只有當我重啟整個Django,對應的數據才會在前臺進行改變。


這是為什麽呢?很簡單,看看我們在class FM裏面的定義,city3是這個類的靜態字段,換句話說,這個字段在編譯這個類的時候就初始化了,而當我們刷新頁面,實例化對象的時候,這個靜態字段的值並不會因為實例的不同而改變。那麽為了改變對應的字段,解決方案就很明顯了,要麽在實例化以後的對象重新賦值,要麽在實例化的過程中復制。這裏我選擇在實例化的過程中賦值,只需要自己重寫一下init構造函數就行了。


修改代碼:

註意super的使用,繼承父類的init方法,然後再執行自己的賦值語句

city3=fields.ChoiceField(
       #反正要重新賦值,靜態字段就沒有必要賦值了
        choices=[]
)

def __init__(self,*args,**kwargs):
        super(FM,self).__init__(*args,**kwargs)
        self.fields[‘city3‘].choices=models.city.objects.all().values_list(‘id‘,‘name‘)


這樣就實現了動態地改變select內容的效果。


除此以外,Django本身也提供了一個內置的類來實現這個動態效果。

導入類,然後定義一個字段

from django.forms import ModelChoiceField
city4=forms.ModelChoiceField(
        queryset=models.city.objects.all(),
        empty_label=‘請選擇城市‘,
)


效果如下


技術分享

本文出自 “麻婆豆腐” 博客,請務必保留此出處http://beanxyz.blog.51cto.com/5570417/1969418

Django 表單 (中)-動態實現select效果