5

私は真剣にこれを行う方法を理解できません。

Django フォームを使用して、次の検証を行いたいと思います (不明な数のaname):

<input type="hidden" name="aname" value="someJSONdump1"/>
<input type="hidden" name="aname" value="someJSONdump2"/>
<input type="hidden" name="aname" value="someJSONdump3"/>
<input type="hidden" name="aname" value="someJSONdump4"/>

そしてdjango側では、私は呼んでいます:

form = myforms.MyForm(request.POST, request.FILES)
if (form.is_valid()):
    # do something
else:
    # redisplay the form

MyFormそれぞれを検証anameし、エラーが発生した場合にウィジェットが上記を再表示できるように定義するにはどうすればよい<input>sですか?

MultiValueFieldの使用方法や、使用するのが正しいかどうかさえわかりません。いくつのフィールドがあるかがわかると解決しそうですか?

clean_aname()フォームでの使用はself.cleaned_data.get('aname')、最後の値のみであるため、役に立ちません。

フォームがなければ のようなものを使いますがrequest.POST.getlist('aname')、 でできるなら避けたいですdjango.forms

ご協力いただきありがとうございます。


編集

ModelForm からさらに多くのフィールドを定義していたことは脇に置きました。これはフォームセットに何らかの影響を与える可能性があると思います。これが私がいる場所です...このソリューションは「Djangoフォーム」と互換性があると見なされますか?

class MyField(forms.Field):
    widget = MyWidget

    def to_python(self, value):
        if (isinstance(value, basestring)):
            value = [value]
        return [json.loads(v) for v in value]

class MyForm(forms.ModelForm):
    class Meta:
        model = models.MyModel

    aname = MyField()

    def clean(self):
        cleaned_data = super(MyForm, self).clean()
        cleaned_data['aname'] = self.fields['aname'].clean(self.data.getlist('aname'))
        return cleaned_data

MyWidgetここで、のリストを表示できるように定義する必要があります<input type="hidden">が、この解決策が受け入れられるかどうかを知りたいです。たぶん、私もこれを行うことができたでしょうclean_aname()

4

2 に答える 2

0

一連のフォーム(Django内ではフォームセットと呼ばれます)を使用してこれを実装してみることができます。各フォームは、必要な検証フォームのインスタンスになります。例えば、

class ValidationForm(forms.Form):
    aname = forms.CharField()

    def clean_aname(self):
        aname = self.cleaned_data['aname']
        # TODO validate aname
        return aname

    def save(self, commit=False):
        # TODO implement this form's save logic
        return 'It works!'

これらのフォームのセットを作成するには(フォームセットのドキュメントを参照)、次の手順を実行します。

from django.forms.formsets import formset_factory
ValidationFormSet = formset_factory(ValidationForm)

ビューで、データを受信するためにValidationFormSetを使用します。

def my_view(request):
    if request.method == 'POST':
        form = ValidationFormSet(request.POST, request.FILES)

        if form.is_valid():
            # All anames were validated by clean_aname
            results = form.save()

            for r in results:
                print r # Should print 'It works!'
    else:
        form = ValidationFormSet()

    return <your_result>
于 2012-11-08T00:29:58.200 に答える
0

次のように、プレフィックスを使用して複数のフォームをビューに渡すことができます。

jsondumplist = ['jsondump1', 'jsondump2', 'jsondump3', 'jsondump4'....]
if request.method == 'POST':
        forms = [YourForm(request.POST, prefix=x) for x in jsondumplist]                        
        for f in forms:
                if f.is_valid():
                        f.save()                 
else:
        forms = [YourForm(prefix=x) for x in jsondumplist]

YourFormには、関心のある単一のフィールドだけ、または複数のフィールドを含めることができます。

class YourForm(forms.Form):
    aname = forms.CharField(widget=forms.HiddenInput())

次に、テンプレートは次のようになります。

{% for form in forms %}
    {% for field in form %}
        {{ field }}
    {% endfor %}
{% endfor %}
于 2012-11-08T00:33:15.007 に答える