【问题标题】:CBV: How To Make A Drop Down Database Query Using Django FormViewCBV:如何使用 Django FormView 进行下拉数据库查询
【发布时间】:2019-12-31 04:22:44
【问题描述】:

我想做的是有一个包含数据库对象的下拉列表。当用户选择一个对象时,我希望页面上显示的信息。

我能够做的是下拉列表中显示的值,但我无法显示我想要的方式。我一直在尝试以某种方式这样做,希望能够更好地控制表单的外观。

models.py

class Vehicle(models.Model):
    make = models.CharField(max_length=20)
    model = models.CharField(max_length=20)

    def __str__(self):
        return self.make + ' ' + self.model


class Package(models.Model):
    make_model = models.ForeignKey(
        Vehicle, on_delete=models.CASCADE
    )
    name = models.CharField(max_length=20)
    price = models.IntegerField()

views.py

class VehicleCompareView(FormView):
    template_name = "main/somehtml.html"
    form_class = forms.CompareForm

forms.py

objectlist = forms.ModelChoiceField(queryset=models.Package.objects.all() \
    .order_by('make_model__make'))

html文件

<form method="GET">
     <select class="form-control">
        <option value="0" selected disabled>Select Vehicle 1</option>
        {% for q in form.objectlist %}
        <option value="{{q.name}}">{{ q.make_model__make }}</option>
        {% endfor %}
     </select>
</form>

<div>
    <p>Selected Vehicle: {{q.make_model__make}} {{q.make_model__model}}<br>
       Price: ${{q.price}}
    </p>
</div>

所以,让我们从我发现的代码开始吧。

如果我使用 {{form}},我会得到包列表,但它当然只显示包名称。如果我尝试在 forms.py 中的查询集中使用 .values(),它会返回我想要的,但是在字典中(所以它会字面上显示 'make': 'someMake', 'model':'someModel' , 'package:'somepackage') 在用户下拉列表中。

当我尝试执行我喜欢的选择/选项方式时,在 for 循环之后执行 {{ q }} 返回相同的包列表,但如果我尝试格式化我想看到的内容 {{ q. make_model__make }} {{ q.make_model__model }} {{q.name}},除了空白下拉列表(尽管空白的数量正确),没有任何显示。

可能有比我正在尝试的更好的方法,但是从这里的大量搜索和环顾中,我找到了使用带有 ModelChoiceField 查询集的 FormView 的方法。归根结底,我想要一个下拉列表来显示数据库中的 Make Model Name。当用户进行选择时,我想在页面上显示属性。显然我还没有谈到选择部分的问题。据我了解,我需要使用 Ajax 来填充所有内容。但这是另一个问题。现在我只想让下拉菜单以我想要的方式显示。最好使用选择/选项方法,这样我就可以控制外观,而不仅仅是呈现通用表单。

【问题讨论】:

    标签: python django database


    【解决方案1】:

    我解决了我的问题。我开始阅读我能找到的所有关于 Django 查询表单的帖子,包括那些与我的问题无关的帖子,以更好地了解一切是如何运作的。有人提到select语句是内置在ModelForm里面的。然后我意识到我试图强迫两种不同的事情,以及为什么我所做的事情并没有真正的意义。我又玩了一些代码,这就是我为解决以我想要的方式显示的问题所做的。

    forms.py

    objectlist = forms.queryset = models.Vehicle.objects.all().order_by('make')
    
    

    html

    <form>
            <select class="form-control">
                <option value="" selected disabled>Select Vehcile 1</option>
                {% for q in form.objectlist %}
                    {% for b in q.package_set.all %}
                <option value="">
                    {{ q.make }} {{ q.model }} {{ b.name }}
                </option>
                    {% endfor %}
                {% endfor %}
            </select>
        </form>
    

    使用嵌套的 for 循环是我可以让相关模型的属性显示在同一个选择下拉列表中的唯一方法。模型包有一个称为“make_model”的外键,它引用模型车辆。我无法调用“make_model__make”以在下拉列表中显示与包相关的车辆名称。

    我会把我的错误留给遇到类似问题的其他人,看看在这种情况下不应该做什么以及最终对我有用的事情。

    【讨论】:

      猜你喜欢
      • 2017-07-06
      • 2020-03-05
      • 2015-01-16
      • 1970-01-01
      • 2016-05-03
      • 2014-01-31
      • 2019-12-22
      • 1970-01-01
      • 2022-10-25
      相关资源
      最近更新 更多