gpt4 book ai didi

用于多个值的 django 字段/小部件

转载 作者:行者123 更新时间:2023-12-03 17:54:40 25 4
gpt4 key购买 nike

我真的不知道如何做到这一点。

我想使用 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 定义更多字段。我认为这可能会对 formset 产生一些影响。这就是我所在的地方......这个解决方案是否被认为与“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() 中做到这一点也。

最佳答案

您可以尝试使用一组表单(在 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!'

要创建一组这些表单(请参阅 formset documentation ),请执行以下操作:
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>

关于用于多个值的 django 字段/小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13279762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com