DJANGO:依赖于数据库的组合框保持为空,没有项目出现

91zkwejq  于 2023-07-01  发布在  Go
关注(0)|答案(2)|浏览(107)

我想创建一个组合框,并显示数据库表中的数据(城市名称)。页面是app1/home.html。我创建了文件并迁移了数据库,但组合框仍然为空。我不知道我做错了什么。我是新来的Django,对不起。我看了很多教程和问题,但都没有解决。
如何修复组合框并在其中正确显示City_Name?谢谢你!!

models.py

数据库的表被称为app1_select_city,而里面有:idCity_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>
h6my8fg2

h6my8fg21#

好吧,这里有很多问题要解决。
您的模型没有名称字段!它只有一个名为Select_CityIntegerField,与类同名。这可不妙通常,您希望使用驼峰格式编写不带下划线的模型,并使用下划线和不带大写字母的字段。

from django.db import models 

class City(models.Model): 
    name = models.CharField(max_length=30) 

    def __str__(self):
        # here you want to return the name
        # print function on an instance of this model then returns the name
        return self.name

在这些更改之后,您必须使用python manage.py makemigrationspython manage.py migrate。如果出现问题,我建议删除数据库和迁移,然后使用上述命令重新启动。
forms.py。为什么这里需要输入?如果您只想选择其中一个型号,则只需ModelChoiceField

from .models import City

class SelectCityForm(forms.Form):
    city = forms.ModelChoiceField(queryset=City.objects.all())

    class Meta:
        model = City
        fields = ('name')

好了,现在当涉及到你的视图时,你想把它的逻辑分成get和post请求。当用户要选择一个城市时,他“进入”你的表单。POST请求后,他选择了一个表格,当他按下提交的形式。然后在POST请求中,您希望显示您所混淆的“combobox”。我称之为城市细节。在GET上,你不需要在这里创建query_results,因为这已经在表单中发生了。而在POST中,您希望过滤所选城市id的查询集。

def city_detail(request):
    form = CitySelectForm()
    object = None
    if request.method == "POST":
        form = CitySelectForm(request.POST)
        if form.is_valid():
            city_id = form.cleaned_data['city']
            object = City.objects.get(id=city_id)

    context = {'form': form, 'object': object}
    return render(request, 'app1/home.html', context)

模板应该在GET上显示表单,在POST上显示City-Details(对象)

<form action="/url-to-city_detail-view/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>
{% if object %}
Here you can embed data of your city such as the ID: {{ object.id }} or the Name: {{ object.name }}. Since you defined the __str__ method you can also
just put {{ object }} and it will give the name.
{% endif %}

总而言之,我不得不说这仍然不是最干净的方法,因为你通常会“选择”一个数据库的对象,并将参数传递给URL。

eoigrqb6

eoigrqb62#

我认为这个问题主要涉及到你的models.pyhome.html
1.在models.py中:

from django.db import models 
class Select_City(models.Model): 
    City_Name = models.CharField(max_length=100) 

    def __str__(self):
        return self.City_Name

    class Meta:
        db_table = 'app1_select_city'

db_table属性确保模型链接到app1_select_city表。
此外,由于您可以直接返回City_Name,这是一个char字段而不是int字段,因此您可以在您的forms.py中重用它。
1.在home.html中,:要显示组合框中的选项,需要为query_results查询集中的每个对象添加一个option元素。这将为查询集中的每个城市创建一个选项,其中id作为选项值,City_Name作为选项标签。

<form method="post" novalidate>
  {% csrf_token %}
<select id="sel_city" name="city">
    <option value="">Select a city</option>
    {% for city in query_results %}
        <option value="{{ city.id }}">{{ city.City_Name }}</option>
    {% endfor %}
</select>

另一个快速编辑:您应该在if-block外部的views.py中初始化form,以便始终初始化表单

相关问题