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 forms”兼容的?

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 回答