Django 表單 (中)-動態實現select效果
阿新 • • 發佈:2017-09-29
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效果