前言
select下拉框選項經常會需要從數據庫動態拿數據,每次刷新頁面能拿到最新的數據。
Teacher 模型
Teacher 表
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
class Teacher(models.Model):
"""老師表"""
name = models.CharField(max_length=30)
age = models.IntegerField(blank=True, null=True)
tel = models.CharField(max_length=30)
表里面新增一些數據
form與views
form 表單設計下拉框,下拉框的值讀取Teacher表的id和name字段
from django import forms
from .models import Teacher
from django.forms import widgets
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
class SelectDemo(forms.Form):
teacher = forms.CharField(
label="老師",
initial=[1, ],
widget=widgets.Select())
# 保證每次訪問重新獲取最新數據
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["teacher"].widget.choices = Teacher.objects.values_list("id", "name")
數據庫讀取的數據返回list of tuple格式,如
[
("1", "悠悠老師"),
("2", "張三老師"),
("3", "李四老師"),
("4", "王五老師"),
]
views.py視圖打開頁面
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
class SelectDemoView(View):
def get(self, request):
form_obj = SelectDemo()
return render(request, "select.html", locals())
模板
模板中讀取select下拉框字段
<form action="" method="POST" id="detail-form" >
{% csrf_token %}
{% for field in form_obj %}
<p>
{{ field.label_tag }}
{{ field }}
{{ field.errors }}
</p>
{% endfor %}
<p>
<input type="submit" value="提交" >
</p>
</form>
select下拉框顯示效果
form_model實現下拉框
還可以用下面這種方式,通過form_model實現
from .models import Teacher
from django.forms import models as form_model
class SelectDemo(forms.Form):
# 下拉單選
teacher = form_model.ModelChoiceField(
label="老師",
initial=[1, ],
queryset=Teacher.objects.all())
# 下拉多選
# teacher = form_model.ModelMultipleChoiceField(queryset=Teacher.objects.all())
但是在 Teacher 模型里面需定義__str__
方法,並且返回name值
class Teacher(models.Model):
"""老師表"""
name = models.CharField(max_length=30)
age = models.IntegerField(blank=True, null=True)
tel = models.CharField(max_length=30)
def __str__(self):
return self.name
這樣我們在頁面上看到的效果就是跟上面一樣