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の 2 つの異なる URL が必要です。両方ではなく、 または のいずれかがパラメータとして渡されます。何かのようなもの:thingstuffthingstuff

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

1 つのフォームと 1 つのビューでこれを行う方法はありますか? または、 and に対して別のフォームを作成thingstuff、ビューに渡されたフォームを確認し、それに応じて適切な URL にリダイレクトする必要がありますか? これをどのように行いますか?アイデアをありがとう!

4

2 に答える 2

0

あまりDRYには見えませんが、これが私が問題を解決した方法です:

フォーム.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:

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 に答える
0

thingまたはstuffが渡されたかどうかに基づいて、オプションでさまざまな要素を表示できるため、ビューには次のようになります。

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 に答える