【发布时间】: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 来填充所有内容。但这是另一个问题。现在我只想让下拉菜单以我想要的方式显示。最好使用选择/选项方法,这样我就可以控制外观,而不仅仅是呈现通用表单。
【问题讨论】: