【发布时间】:2016-03-25 00:58:38
【问题描述】:
我有一个用于现场应急照明测试的 CreateView。它从 url 获取站点,因此用户无需将其输入到表单中。 CreateView 还有一个应急照明设备表单集,可将多个设备附加到主测试。当我在表单上点击提交时,我得到了
form_valid() 只接受 2 个参数(给定 3 个)
models.py
class Site(models.Model):
....
class EmergencyLighting(models.Model):
site = models.ForeignKey(Site)
class EmergencyLightingDevice(models.Model):
emergency_lighting = models.ForeignKey(EmergencyLighting)
views.py
class FormsetMixin(object):
object = None
def get(self, request, *args, **kwargs):
if getattr(self, 'is_update_view', False):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
formset_class = self.get_formset_class()
formset = self.get_formset(formset_class)
return self.render_to_response(self.get_context_data(form=form, formset=formset))
def post(self, request, *args, **kwargs):
if getattr(self, 'is_update_view', False):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
formset_class = self.get_formset_class()
formset = self.get_formset(formset_class)
if form.is_valid() and formset.is_valid():
return self.form_valid(form, formset)
else:
return self.form_invalid(form, formset)
def get_formset_class(self):
return self.formset_class
def get_formset(self, formset_class):
return formset_class(**self.get_formset_kwargs())
def get_formset_kwargs(self):
kwargs = {
'instance': self.object
}
if self.request.method in ('POST', 'PUT'):
kwargs.update({
'data': self.request.POST,
'files': self.request.FILES,
})
return kwargs
def form_valid(self, form, formset):
self.object = form.save()
formset.instance = self.object
formset.save()
return redirect('/sites/list')
def form_invalid(self, form, formset):
return self.render_to_response(self.get_context_data(form=form, formset=formset))
class EmergencyLightingCreate(FormsetMixin, CreateView):
template_name = 'emergency_lighting/emergencylighting_form.html'
model = EmergencyLighting
form_class = EmergencyLightingForm
formset_class = EmergencyLightingFormSet
def form_valid(self, form):
emergency_lighting = form.save(commit=False)
emergency_lighting.site_id = self.kwargs['site']
return super(EmergencyLightingCreate, self).form_valid(form)
forms.py
class EmergencyLightingForm(forms.ModelForm):
class Meta:
model = EmergencyLighting
exclude = ('creation', 'last_modified')
class EmergencyLightingDeviceForm(forms.ModelForm):
class Meta:
model = EmergencyLightingDevice
exclude = ('creation', 'last_modified')
EmergencyLightingFormSet = inlineformset_factory(EmergencyLighting, EmergencyLightingDevice,
extra=0, min_num=1, exclude=('creation', 'last_modified'))
urls.py
url(r'^(?P<site>[0-9]+)/create/$', EmergencyLightingCreate.as_view(), name='emergency-lighting-create'),
【问题讨论】:
-
错误出现在哪里?您在这里包含了很多代码,但并非所有代码看起来都相关(即
get_formset方法等)请包含堆栈跟踪并尝试仅包含与您的问题相关的信息