我想创建一个组合框,并显示数据库表中的数据(城市名称)。页面是app1/home.html。我创建了文件并迁移了数据库,但组合框仍然为空。我不知道我做错了什么。我是新来的Django,对不起。我看了很多教程和问题,但都没有解决。
如何修复组合框并在其中正确显示City_Name
?谢谢你!!
models.py
数据库的表被称为app1_select_city
,而里面有:id
和City_Name
from django.db import models
class Select_City(models.Model):
Select_City= models.IntegerField()
def __str__(self):
return self.Select_City
forms.py
from .models import Select_City
class TestForm(forms.Form):
some_input = forms.CharField(max_length=100)
city = forms.ModelChoiceField(queryset=Select_City.objects.all())
class Meta:
model = Select_City
fields = ('City_Name',)
views.py
def combobox(request):
query_results = Select_City.objects.all()
if request.method =="POST":
form = TestForm(request.POST)
context = {'form': form, 'query_results': query_results}
return render(request, 'app1/home.html', context)
首页.html
<form method="post" novalidate>
{% csrf_token %}
<select id="sel_city" name="cities">
<option value="{{ query_results }}">Select</option>
{% for item in query_results %}
{% endfor %}
</select>
</form>
2条答案
按热度按时间h6my8fg21#
好吧,这里有很多问题要解决。
您的模型没有名称字段!它只有一个名为
Select_City
的IntegerField
,与类同名。这可不妙通常,您希望使用驼峰格式编写不带下划线的模型,并使用下划线和不带大写字母的字段。在这些更改之后,您必须使用
python manage.py makemigrations
和python manage.py migrate
。如果出现问题,我建议删除数据库和迁移,然后使用上述命令重新启动。forms.py。为什么这里需要输入?如果您只想选择其中一个型号,则只需
ModelChoiceField
好了,现在当涉及到你的视图时,你想把它的逻辑分成get和post请求。当用户要选择一个城市时,他“进入”你的表单。POST请求后,他选择了一个表格,当他按下提交的形式。然后在POST请求中,您希望显示您所混淆的“combobox”。我称之为城市细节。在GET上,你不需要在这里创建
query_results
,因为这已经在表单中发生了。而在POST中,您希望过滤所选城市id的查询集。模板应该在GET上显示表单,在POST上显示City-Details(对象)
总而言之,我不得不说这仍然不是最干净的方法,因为你通常会“选择”一个数据库的对象,并将参数传递给URL。
eoigrqb62#
我认为这个问题主要涉及到你的
models.py
和home.html
1.在
models.py
中:db_table
属性确保模型链接到app1_select_city
表。此外,由于您可以直接返回City_Name,这是一个
char
字段而不是int
字段,因此您可以在您的forms.py
中重用它。1.在
home.html
中,:要显示组合框中的选项,需要为query_results
查询集中的每个对象添加一个option
元素。这将为查询集中的每个城市创建一个选项,其中id作为选项值,City_Name作为选项标签。另一个快速编辑:您应该在
if-block
外部的views.py
中初始化form
,以便始终初始化表单