2010-07-29 3 views
1

Возможно ли сделать inlineformset_factory модель ModelForm, а также модель. Когда я пытаюсь запустить это, я получаю сообщение об ошибке «Объект NoneType» не является итерируемым.inlineformset_factory, состоящий из ModelForm

Пожалуйста, помогите, я провел целый день, пытаясь понять это. Благодарю.

Код:

Model.py

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)) 

ответ

1

UPDATE: Если вы намеревались создать FormSet с контроллером и модели фильтра, где фильтр держит FK для Контроллер, вам необходимо:

FilterFormSet = inlineformset_factory(Controller, Filter, form=FilterForm) 

Обратите внимание, что в вашем коде выше вы передаете класс модели контроллера, что вызвало некоторую путаницу.

+0

Tks для вашего ответа. Я изменил свой код на FilterFormSet = inlineformset_factory (Controller, form = FilterForm, extra = 5), но теперь я получаю эту ошибку: inlineformset_factory() принимает не менее 2 аргументов без ключевого слова (1 задано) – Przemek

+0

Привет, см. Мое обновление к ответу. – ars

+0

На самом деле есть отношение внешних ключей. Контроллер содержит один или более Filters.class фильтра (компонент): \t контроллера \t = models.ForeignKey (контроллер) \t \t targetURI = models.ForeignKey ('я', verbose_name = 'Целевого URI', NULL = True, пустые = True) \t \t FilterType = models.CharField ('Type', max_length = 64, выбор = FILTER_TYPES, пусто = False, по умолчанию = 'avgFilter') \t \t \t порядок = models.IntegerField ('Order') – Przemek

Смежные вопросы