1

Ich muss Fremdschlüsselauswahloptionen auf einem Formular basierend auf einer Objekt-ID filtern, die von einer Ansicht übergeben wird. Ich habe die folgende Ansicht:Django inlineformset_factory mit queryset

@login_required() 
def QAView(request, equipamento_id): 
    form = ActividadeForm() 
    equipamento = Equipamento.objects.get(id=equipamento_id) 
    testes_list = Teste.objects.filter(equipamento=equipamento_id) 
    form1 = inlineformset_factory(
       Actividade, Resultado, form=ResultadoForm, 
       exclude=('actividade',), extra=len(testes_list)) 

    context = {'equipamento_id': equipamento_id, 
       'data':datetime.now(), 'equipamento': equipamento, 
       'form': form, 'testes_list': testes_list, 
       'form1': form1} 
    template = 'SFM/Equipamento/QA.html' 
    return render(request, template, context) 

Hier meine Formen sind:

class ActividadeForm(forms.ModelForm):  
    class Meta: 
     model = Actividade 
     fields = ['tipo'] 
     exclude = ['conclusoes'] 


class ResultadoForm(forms.ModelForm): 
    frequencia = forms.CharField(max_length=50) 
    tolerancia = forms.CharField(max_length=255) 
    #def __init__(self, equipamento_id, *args, **kwargs): 
     #super (ResultadoForm,self).__init__(*args,**kwargs) 
     #self.fields['teste'].queryset = Teste.objects.filter(equipamento=equipamento_id) 
    class Meta: 
     model = Resultado 
     exclude = ['actividade'] 

Dies geht alle Hoden (die ein foreignkey zu Teste Modell ist) in das Formular. Was ich brauche, ist, diesen Fremdschlüssel abzufragen, um nur die Hoden zu erhalten, die mit equipamento_id durch die Ansicht verbunden sind. Teste hat eine vielfache Beziehung zu Equipamento. Wenn ich das tue:

form1 = inlineformset_factory(Actividade, Resultado, form=ResultadoForm(equipamento_id), exclude=('actividade',), extra=len(testes_list)) 

und init Methode in ResultadoForm kommentiert definieren, erhalte ich folgende Fehlermeldung:

Traceback: 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\core\handlers\base.py" in get_response 
    149.      response = self.process_exception_by_middleware(e, request) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\core\handlers\base.py" in get_response 
    147.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\contrib\auth\decorators.py" in _wrapped_view 
    23.     return view_func(request, *args, **kwargs) 

File "C:\Users\i11931\Documents\DjangoProjects\IPO\SFM\views.py" in QAView 
    37.  exclude=('actividade',), extra=len(testes_list)) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\forms\models.py" in inlineformset_factory 
    1049.  FormSet = modelformset_factory(model, **kwargs) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\forms\models.py" in modelformset_factory 
    847.        error_messages=error_messages, field_classes=field_classes) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\forms\models.py" in modelform_factory 
    545.  return type(form)(class_name, (form,), form_class_attrs) 

File "C:\Users\i11931\Documents\DjangoProjects\IPO\SFM\forms.py" in __init__ 
    23.  self.fields['teste'].queryset = Teste.objects.filter(equipamento=equipamento_id) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\manager.py" in manager_method 
    122.     return getattr(self.get_queryset(), name)(*args, **kwargs) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\query.py" in filter 
    790.   return self._filter_or_exclude(False, *args, **kwargs) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\query.py" in _filter_or_exclude 
    808.    clone.query.add_q(Q(*args, **kwargs)) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\sql\query.py" in add_q 
    1243.   clause, _ = self._add_q(q_object, self.used_aliases) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\sql\query.py" in _add_q 
    1269.      allow_joins=allow_joins, split_subq=split_subq, 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\sql\query.py" in build_filter 
    1199.    condition = lookup_class(lhs, value) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\lookups.py" in __init__ 
    19.   self.rhs = self.get_prep_lookup() 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\fields\related_lookups.py" in get_prep_lookup 
    98.      self.lookup_name, self.rhs) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\fields\__init__.py" in get_prep_lookup 
    744.    return self.get_prep_value(value) 

File "C:\Users\i11931\Programas\Python3.5.1\lib\site-packages\django-1.9-py3.5.egg\django\db\models\fields\__init__.py" in get_prep_value 
    976.   return int(value) 

Exception Type: ValueError at /SFM/Equipamento/6/QA/ 
Exception Value: invalid literal for int() with base 10: 'ResultadoForm' 

Aber wenn ich ersetzen form1 durch:

form1 = ResultadoForm(equipamento_id) 

I Ich bin in der Lage, die Hoden zu filtern, die mit dieser equipamento_id verbunden sind, aber ich kann die Inline-Beziehungen nicht erstellen. Warum ist das? Wie kann ich diese equipamento_id an den inlineformset übergeben, um einen queryset zu erstellen? Bitte Hilfe ...

+0

Aktualisieren Sie Ihre Frage mit dem vollen stacktrce und den Formen – e4c5

+0

aktualisiert ... @ e4c5, fügten die Valueerror Traceback, die ich bekomme – user2466766

+0

ein paar Zeilen um die Linie 37 in Ihrer views.py sage von Zeile 30 bis 45 – e4c5

Antwort

1

hier ist das Problem

return type(form)(class_name, (form,), form_class_attrs) 

Dies ist, wo das Formular initialisiert wird. Der erste Parameter, der an die __init__-Methode Ihres Formulars übergeben wird, ist der Klassenname des Formulars ein String. Jedoch Ihre __init__ wie dies hier

def __init__(self, equipamento_id, *args, **kwargs): 
    super (ResultadoForm,self).__init__(*args,**kwargs) 
    self.fields['teste'].queryset = Teste.objects.filter(equipamento=equipamento_id) 

Der erste Parameter aussieht, ist equipamento_id und das ist zugewiesen ‚ResultadoForm‘, aber Sie es als eine ganze Zahl in der nächsten Zeile in den Abfragefilter verwenden. Daher der Fehler. Mit Blick auf den Quellcode für modelform_factory ist nicht klar, wie Sie tatsächlich einen equipamento_id als Parameter über inlineformset_factory übergeben.

Sie haben so etwas wie

equipamento_id = kwargs.pop('equipamento_id') 

versuchen, aber ich bin nicht sicher, wie dies durch inlineform_set versendet werden können.

+0

Vielen Dank für Ihre Erklärung. Es war sehr klar. Mir fehlen einige Grundkenntnisse und die Parametertypen sind durcheinander. Ich habe versucht, die vorgeschlagene Änderung, aber immer noch kein Glück. Ich bekomme einen anderen Fehler, also warst du richtig. Ich werde nicht als eine Antwort markieren, in der Hoffnung, dass jemand mir noch eine Lösung für dieses spezielle Problem geben kann, aber Ihre Antwort hat diesen Fehler definitiv gelöst. – user2466766

+0

Ja, Sie haben Recht, es offen zu halten. Aber ein upvote wird dankbar geschätzt :). Darf ich vorschlagen, dass Sie auch eine neue Frage stellen?In dieser neuen Frage können Sie sagen: "Ich muss Fremdschlüsselauswahloptionen in einem Formular basierend auf einer von einer Ansicht übergebenen Objekt-ID filtern." und dann, dass Sie inline_formset ausprobiert haben, aber mit der Schwierigkeit konfrontiert wurde, Parameter an das Formular zu übergeben. – e4c5

+0

Ich werde Ihre Antwort markieren. Ich konnte es lösen, weil ich eine andere Frage gestellt habe, wie Sie vorgeschlagen haben. Ihre Tipps erlauben mir, dieses Problem zu lösen, also vielen Dank. Der Trick war, formset = ArticleFormSet (form_kwargs = {'user': request.user}) nach @Shang Wang Antwort zu tun. – user2466766