You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django依赖数据库的下拉框为空无数据显示问题求助

修复Django下拉框无法显示城市名称的问题

问题分析与修正步骤

1. 模型(models.py)定义错误

你的数据库表包含City_Name字段,但代码里定义的是Select_City整数字段,完全不匹配;同时__str__方法返回整数,无法正确显示城市名称。

修正后的models.py:

from django.db import models 

class Select_City(models.Model): 
    City_Name = models.CharField(max_length=100)  # 匹配表中City_Name字段,改为字符类型

    def __str__(self):
        return self.City_Name  # 返回城市名称,让下拉框显示对应内容

2. 表单(forms.py)定义错误

forms.Form不需要Meta类(这是ModelForm的配置方式),多余的配置会导致逻辑混乱,只需保证ModelChoiceField的查询集正确即可。

修正后的forms.py:

from django import forms
from .models import Select_City

class TestForm(forms.Form):
    some_input = forms.CharField(max_length=100)
    # 设置默认提示选项,查询集获取所有城市数据
    city = forms.ModelChoiceField(queryset=Select_City.objects.all(), empty_label="请选择城市")

3. 视图(views.py)初始化错误

GET请求时未初始化表单,会导致模板中form变量未定义报错,需在分支外统一初始化表单。

修正后的views.py:

from django.shortcuts import render
from .forms import TestForm
from .models import Select_City

def combobox(request):
    query_results = Select_City.objects.all()
    # 无论GET/POST都初始化表单,POST请求时自动传入提交数据
    form = TestForm(request.POST or None)
    
    context = {'form': form, 'query_results': query_results}
    return render(request, 'app1/home.html', context)

4. 模板(home.html)渲染错误

手动编写的select标签没有在循环中输出option内容,且字段name与表单定义不匹配;推荐直接使用Django表单自动生成下拉框,简洁不易出错。

方案一:使用表单自动渲染(推荐)

<form method="post" novalidate>
  {% csrf_token %}
  <!-- 直接渲染表单的city字段,自动生成下拉框 -->
  {{ form.city.label_tag }}
  {{ form.city }}
  <!-- 渲染其他表单字段 -->
  {{ form.some_input.label_tag }}
  {{ form.some_input }}
  <button type="submit">提交</button>
</form>

方案二:手动渲染select标签

<form method="post" novalidate>
  {% csrf_token %}
  <select id="sel_city" name="city">  <!-- name需与表单字段名一致,这里为city -->
    <option value="">请选择城市</option>
    {% for item in query_results %}
    <option value="{{ item.id }}">{{ item.City_Name }}</option>  <!-- 输出城市名称 -->
    {% endfor %}
  </select>
</form>

最终操作步骤

  1. 执行数据库迁移:python manage.py makemigrations 后运行 python manage.py migrate(因修改了模型字段)
  2. 确保app1_select_city表中有城市数据(可通过Django admin添加测试数据)
  3. 重启Django服务,访问对应URL验证效果

内容的提问来源于stack exchange,提问作者Zollikofen4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:07:46