0

这是我的场景:我在页面上有多个选择框,其中用户从 ModelChoiceField 中选择选项并被重定向到一个视图,其中所选选项作为参数传递。就像是:

class BrowseForm(forms.Form):
    thing = forms.ModelChoiceField(queryset=Thing.objects.all(), empty_label=None, widget=forms.Select(attrs={'onchange': 'this.form.submit();'}))
    stuff = forms.ModelChoiceField(queryset=Stuff.objects.all(), empty_label=None, widget=forms.Select(attrs={'onchange': 'this.form.submit();'}))

看法:

def browse(request):
    thing_list = Thing.objects.all()
    if request.method == 'POST':
        form = BrowseForm(request.POST)
        if form.is_valid():
            thing = form.cleaned_data['thing']
            stuff = form.cleaned_data['stuff']
            return HttpResponseRedirect(reverse('browse_thing', kwargs={'thing':thing, 'stuff':stuff}))
    else:
        form = BrowseForm()
    return render(request, 'browse.html', {'form':form, 'thing_list':thing_list})

这要求我提交 的两个字段BrowseForm,但我希望和 有两个不同的 url thingstuff其中一个thingstuff作为参数传递,而不是两者都传递。就像是:

url(r'^browse/things/(?P<thing>[\w-]+)/$', 'views.browse', name='browse_thing'),
url(r'^browse/stuff/(?P<stuff>[\w-]+)/$', 'views.browse', name='browse_stuff'),

有没有办法用一种形式和一种视图来做到这一点?或者我是否需要为thingand编写不同的表单stuff,然后检查哪个表单在我的视图中传递并相应地重定向到适当的 url?你会怎么做?谢谢你的想法!

4

2 回答 2

0

您可以选择根据是否传入thingstuff传入来显示各种元素,因此您的视图将具有:

def browse(request, thing=None, stuff=None):
    # your code, then...
    return render(request, 'browse.html', {
        'form': form,
        'thing_list': thing_list,
        'stuff_list': stuff_list,
        'has_thing': bool(thing),
        'has_stuff': bool(stuff)
    })

然后在您的模板中,您可以执行以下操作:

{% for f in form %}
    {% if f.name == 'thing' and has_thing %}
        <!-- render it -->
    {% endif %}
    {% if f.name == 'stuff' and has_stuff %}
        <!-- render it -->
    {% endif %}
{% endfor %}

还要记住required=False在您的BrowseForm字段中进行设置,这样您就不会出现验证错误,POST因为您只有一个或另一个。

于 2013-01-25T23:04:16.650 回答
0

虽然它看起来不是很干燥,但这就是我解决问题的方法:

表格.py:

class StuffBrowseForm(forms.Form):
    stuff = forms.ModelChoiceField(queryset=Stuff.objects.all(), widget=forms.Select(attrs={'onchange': 'this.form.submit();'}))

class ThingBrowseForm(forms.Form):
    thing = forms.ModelChoiceField(queryset=Thing.objects.all(), widget=forms.Select(attrs={'onchange': 'this.form.submit();'}))

看法:

def browse(request):
    thing_list = Thing.objects.all()
    if request.method == 'POST':
        form1 = StuffBrowseForm(request.POST)
        form2 = ThingBrowseForm(request.POST)
        if form1.is_valid():
            stuff = form1.cleaned_data['stuff']
            return HttpResponseRedirect(reverse('browse_stuffs', kwargs={'stuff':stuff}))
        elif form2.is_valid():
            thing = form2.cleaned_data['thing']
            return HttpResponseRedirect(reverse('browse_things', kwargs={'thing':thing}))
    else:
        form1 = StuffBrowseForm()
        form2 = ThingBrowseForm()
    return render(request, 'browse.html', {'form1':form1, 'form2':form2, 'thing_list':thing_list})

网址:

url(r'^browse/$', 'views.browse', name='browse'),
url(r'^browse/stuff/(?P<stuff>[\w-]+)/$', 'views.browse_stuffs', name='browse_stuffs'),
url(r'^browse/things/(?P<thing>[\w-]+)/$', 'views.browse_things', name='browse_things'),
于 2013-01-26T19:47:13.810 回答