python測試開發django-108.form組件Select下拉框讀取數據庫內容


前言

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

這樣我們在頁面上看到的效果就是跟上面一樣


免責聲明!

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



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