【发布时间】:2015-05-13 19:36:38
【问题描述】:
我正在尝试遵循 @qris 在上一个问题 (django crispy forms: Nesting a formset within a form) 中给出的答案,但我在渲染函数中的 formset = context[self.formset_name_in_context] 处得到了 KeyError。我不太明白发生了什么事。上下文来自哪里?我该如何解决这个问题?
在 forms.py 中,我为我的 AuthorForm 创建了一个表单集:
AuthorFormSet = formset_factory(AuthorForm)
author_formset = AuthorFormSet()
然后我在其他表单的布局中使用author_formset:
self.helper.layout = Layout(
Div(
Div('place', 'sample', css_class='col-xs-6'),
Div('subject_type', 'data_title', css_class='col-xs-6'),
css_class='row'
),
MultiField(
"Authors",
Formset('author_formset'),
)
)
我在views.py中的最新尝试:
class register(TemplateView):
form_class = RegistrationForm()
facility_form = FacilityAndContactForm()
formsets = {
'author_formset': AuthorFormSet,
}
template_name = "databank/depositors.html"
def __init__(self, data, files, *args, **kwargs):
super(register, self).__init__(data, files, *args, **kwargs)
if 'initial' in kwargs:
# Formsets treat this parameter completely differently: they
# expect an array of values instead of just one. So remove it
# because it will break formsets.
kwargs.pop('initial')
for name, formset_class in self.formsets.iteritems():
# doesn't exist yet, so we can't call its queryset() method
queryset = formset_class.model._default_manager.filter(
**{formset_class.fk.name: self.instance})
extra = 0 if queryset.exists() else 1
formset = self.construct_formset(formset_class, data, files, *args, prefix=name, extra=extra, **kwargs)
setattr(self, name, formset)
helper = getattr(formset.form(), 'helper', None)
if helper:
formset.helper = helper
def construct_formset(self, formset_class, data, files, prefix, extra,
*args, **kwargs):
return formset_class(data, files, *args, prefix=prefix, extra=extra,
**kwargs)
def get(self, request, *args, **kwargs):
form_class = self.form_class
return render(request, self.template_name, {'form_class': form_class,
'facility_form': self.facility_form, 'author_formset':
self.formset})
def post(self, request):
form_class = RegistrationForm(request.POST, request.FILES)
facility_form = FacilityAndContactForm(request.POST)
author_formset=AuthorFormSet(request.POST)
formsets = {
'author_formset': author_formset,
}
if form_class.is_valid():
registration = create_registration(form_class)
dataset_name = registration.dataset.dataset_name
# more logic here...
return render(request, 'databank/register.html',
{'registration_form': form_class, 'facility_form': facility_form,
'author_formset': author_formset})
【问题讨论】:
-
@qris 我在哪里/如何最初声明布局对象以传递给新的 Formset 字段?在您的示例实现中,您首先在哪里/如何定义“教育”?
标签: django django-forms django-crispy-forms