Afs*_*in 56 python django django-forms
我的表格中有3个字段.我有一个提交按钮和一个"添加额外字段"按钮.我知道我可以__init__在表单类中使用方法添加字段.
我是Python和Django的新手,我遇到了一个初学者问题:我的问题是:
当我单击"添加附加字段"按钮时,添加附加字段的过程是什么?
表格是否必须再次呈现?
我怎么以及何时打电话__init__或者甚至不得不打电话给它?
我如何传递参数__init__?
Yuj*_*ita 60
您的表单必须根据从POST传递给它的一些变量构建(或盲目检查属性).每次重新加载视图时都会构造表单本身,错误与否,因此HTML需要包含有关构建正确数量的字段以进行验证的字段数的信息.
我会按照FormSet工作方式来看待这个问题:有一个隐藏字段,其中包含活动表单的数量,每个表单名称都以表单索引为前缀.
事实上,你可以创造一个领域 FormSet
https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets
如果您不想使用a,FormSet您可以自己创建此行为.
这是一个从头开始的 - 它应该给你一些想法.它还回答了有关传递参数的问题__init__- 您只需将参数传递给对象构造函数:MyForm('arg1', 'arg2', kwarg1='keyword arg')
class MyForm(forms.Form):
original_field = forms.CharField()
extra_field_count = forms.CharField(widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
extra_fields = kwargs.pop('extra', 0)
super(MyForm, self).__init__(*args, **kwargs)
self.fields['extra_field_count'].initial = extra_fields
for index in range(int(extra_fields)):
# generate extra fields in the number specified via extra_fields
self.fields['extra_field_{index}'.format(index=index)] = \
forms.CharField()
Run Code Online (Sandbox Code Playgroud)
def myview(request):
if request.method == 'POST':
form = MyForm(request.POST, extra=request.POST.get('extra_field_count'))
if form.is_valid():
print "valid!"
else:
form = MyForm()
return render(request, "template", { 'form': form })
Run Code Online (Sandbox Code Playgroud)
<form>
<div id="forms">
{{ form.as_p }}
</div>
<button id="add-another">add another</button>
<input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
<script>
let form_count = Number($("[name=extra_field_count]").val());
// get extra form count so we know what index to use for the next item.
$("#add-another").click(function() {
form_count ++;
let element = $('<input type="text"/>');
element.attr('name', 'extra_field_' + form_count);
$("#forms").append(element);
// build element and append it to our forms container
$("[name=extra_field_count]").val(form_count);
// increment form count so our view knows to populate
// that many fields for validation
})
</script>
Run Code Online (Sandbox Code Playgroud)
Al *_*rad 11
我有一个案例,当我不得不动态创建动态字段的表单.我用这个技巧做了:
from django import forms
...
dyn_form = type('DynForm', # form name is irrelevant
(forms.BaseForm,),
{'base_fields': fields})
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此链接: 动态表单
但除此之外我还必须注入字段,即在创建表单类后动态添加字段.
dyn_form.base_fields['field1'] = forms.IntegerField(widget=forms.HiddenInput(), initial=field1_val)
dyn_form.base_fields['field2'] = forms.CharField(widget=forms.HiddenInput(), initial=field2_val)
Run Code Online (Sandbox Code Playgroud)
这很有效.
| 归档时间: |
|
| 查看次数: |
63685 次 |
| 最近记录: |