如何使用CBV或FBV从选定的表单中获取数据

时间:2019-09-02 19:42:34

标签: python django forms get

我在显示来自模型的数据时遇到问题,该模型是从选择表单中检索到的。我更喜欢使用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>

,我不喜欢它,但是如果可以的话,我可以按照我希望以后查看的方式进行格式化。但是,不再有一个下拉框。只有一个提交按钮。

再次,只是为了明确说明我要做什么,最终结果是两个下拉框,其中包含数据库中的选项供您选择。我希望它们显示为“制造模型包装”,该包装是包含“制造”和“模型”的“车辆模型”的外键。一旦用户做出选择,就应该显示每个表单的信息。

0 个答案:

没有答案