Django inlineformset_工厂由ModelForm组成
inlineformset_工厂是否可以采用ModelForm和model。当我尝试运行此程序时,会收到一条错误消息“NoneType”对象不可编辑 请帮帮我,我花了一整天的时间想弄明白。谢谢 代码: Model.pyDjango inlineformset_工厂由ModelForm组成,django,django-models,django-forms,Django,Django Models,Django Forms,inlineformset_工厂是否可以采用ModelForm和model。当我尝试运行此程序时,会收到一条错误消息“NoneType”对象不可编辑 请帮帮我,我花了一整天的时间想弄明白。谢谢 代码: Model.py class FilterForm(ModelForm): firstFilter = forms.BooleanField(label='First Filter', initial=False, required=False) class Meta: model = F
class FilterForm(ModelForm):
firstFilter = forms.BooleanField(label='First Filter', initial=False, required=False)
class Meta:
model = Filter
exclude = ('order')
class Controller(models.Model):
protocol = models.CharField('Protocol',max_length=64, choices=PROTOCOLS, default='http')
server = models.CharField('Server', max_length=64, choices=SERVERS, default='127.0.0.1')
name = models.CharField('Name', max_length=64)
def __unicode__(self):
return self.protocol + '://' + self.server + '/' + self.name
view.py
def controller_details(request, object_id):
controller = Controller.objects.get(pk=object_id)
controllerURI = controller.protocol + '://' + controller.server + '/' + controller.name
FilterFormSet = inlineformset_factory(Controller, FilterForm, extra=5)
if request.method == 'POST':
formset = FilterFormSet(request.POST, request.FILES, instance=controller)
if formset.is_valid():
filters = []
# Save all the filters into a list
forms = formset.cleaned_data
for form in forms:
if form:
protocol = form['protocol']
server = form['server']
name = form['name']
targetURI = form['targetURI']
filterType = form['filterType']
firstFilter = form['firstFilter']
if firstFilter == True:
aFilter = Filter(controller=controller, protocol=protocol, server=server, name=name, targetURI=targetURI, filterType=filterType, order=0)
else:
aFilter = Filter(controller=controller, protocol=protocol, server=server, name=name, targetURI=targetURI, filterType=filterType, order=-1)
filters.append(aFilter)
# Find the first filter in the list of filters
for index, aFilter in enumerate(filters):
if aFilter.order == 0:
break
if filters[index].targetURI:
test = "yes"
else:
for aFilter in filters:
aFilter.save()
else:
formset = FilterFormSet(instance=controller)
return render_to_response('controller_details.html', {'formset':formset, 'controllerURI':controllerURI}, context_instance=RequestContext(request))
更新:如果要创建具有控制器和过滤器模型的表单集,其中过滤器将FK保存到控制器,则需要:
FilterFormSet = inlineformset_factory(Controller, Filter, form=FilterForm)
请注意,在上面的代码中,您只传递了控制器模型类,这造成了一些混乱。更新:如果您打算使用控制器和过滤器模型创建一个表单集,其中过滤器将FK保存到控制器,您需要:
FilterFormSet = inlineformset_factory(Controller, Filter, form=FilterForm)
请注意,在上面的代码中,您只传递了控制器模型类,这造成了一些混乱。Tks供您回复。我将代码更改为FilterPerformSet=inlineformset\u工厂(Controller,form=FilterPerform,extra=5),但现在我遇到了这个错误:inlineformset\u工厂()至少接受2个非关键字参数(给定1个),实际上存在外键关系。控制器包含一个或多个筛选器。类筛选器(组件):控制器=模型。ForeignKey(控制器)targetURI=模型。ForeignKey('self',verbose\u name='Target URI',null=True,blank=True,blank=True)filterType=models.CharField('Type',max\u length=64,choices=Filter\u TYPES,blank=False,default='avgFilter')order=models.IntegerField('Order')谢谢您的回复。我将代码更改为FilterPerformSet=inlineformset_factory(Controller,form=FilterPerform,extra=5),但现在我收到了这个错误:inlineformset_factory()至少接受2个非关键字参数(给定1个),实际上存在外键关系。控制器包含一个或多个筛选器。类筛选器(组件):controller=models.ForeignKey(controller)targetURI=models.ForeignKey('self',verbose\u name='Target URI',null=True,blank=True)filterType=models.CharField('Type',max_length=64,choices=FILTER\u TYPES,blank=False,default='avgFilter')order=models.IntegerField('order'))