我在显示来自模型的数据时遇到问题,该模型是从选择表单中检索到的。我更喜欢使用CBV,但目前只要解决了问题都无所谓。我尝试过两种方法,每种方法都遇到不同的问题。我将从CBV尝试开始。
views.py
class VehicleCompareView(FormView):
template_name = "main/vehicle_compare.html"
form_class = forms.CompareForm
def get(self, request, *args, **kwargs):
form = forms.CompareForm(request.GET)
if form.is_valid():
data = form.cleaned_data
else:
data = None
return self.render_to_response(data)
forms.py
class CompareForm(forms.Form):
objectlist = forms.queryset = models.Vehicle.objects.all().order_by('make')
html
<div class="some class">
<form name="vform" method="get">
<select class="form-control" name="v-selection">
<option value="" selected disabled>Select Vehicle 1</option>
{% for q in form.objectlist %}
{% for b in q.package_set.all %}
<option value="{{q}}" name="v-option">
{{ q.v_make }} {{ q.v_model }} {{ b.name }}
</option>
{% endfor %}
{% endfor %}
</select>
<input value="submit" type="submit">
</form>
<div>
<p>{{data.make}}</p>
</div>
有了这个,我可以有一个下拉框,允许以正确的格式进行选择,但是提交选择后什么也不会返回。
我尝试的下一种方法是使用FBV。我做了这些更改:
views.py
def compare_view(request):
if request.method == 'GET':
form = forms.CompareForm(request.GET)
if form.is_valid():
data = form.cleaned_data.get('v-selection')
return render_to_response('main/vehicle_compare.html', {'data':data}, {'form':form})
return render_to_response('main/vehicle_compare.html', {'form':form})
奇怪的是,我不得不将表单查询更改为以下代码。正确循环模型选项的视图将导致视图呈现来自vehicle_compare.html文件的原义html。 forms.py
objectlist = forms.ModelChoiceField(queryset=models.Vehicle.objects.all())
问题在于选择表单中的对象不再出现。我想发生的事情是能够具有两种形式,允许用户从每种形式中选择一个选项。提交后,结果值应显示在页面上。我的问题是可以使用CBV来完成此操作吗?如果是这样,我应该如何使数据显示在页面上,因为到目前为止我尝试过的所有方法都无效。
更新:使用ModelChoiceField更改CBV Forms.py以定义对象列表,并向views.py添加get函数。我可以获取要显示的数据库对象(例如:{{objectlist.make}},但是该表单下拉列表随后消失了。html现在看起来像:
<form name="v1form" method="get">
{{form}}
<input value="submit" type="submit">
</form>
,我不喜欢它,但是如果可以的话,我可以按照我希望以后查看的方式进行格式化。但是,不再有一个下拉框。只有一个提交按钮。
再次,只是为了明确说明我要做什么,最终结果是两个下拉框,其中包含数据库中的选项供您选择。我希望它们显示为“制造模型包装”,该包装是包含“制造”和“模型”的“车辆模型”的外键。一旦用户做出选择,就应该显示每个表单的信息。