1

ビューで渡されたオブジェクトIDに基づいてフォーム上でforeignkey selectオプションをフィルタリングする必要があります。 私は次のビューがあります。ここではDjango inlineformset_factory with 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) 

は私のフォームは、次のとおりです。

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'] 

これは、フォームに(TESTEモデルにForeignKeyのある)すべての精巣を渡します。私が必要とするのは、ビューによって与えられたequipamento_idに関連する精巣だけを取得するために、この外部キーを照会することです。 TesteはEquipamentoと数多くの関係を持っています。 私が行う場合:

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

とResultadoFormにコメントしのinitメソッドを定義し、私は次のエラーを取得する:

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' 

しかし、私はで、Form1を交換する場合:私は

form1 = ResultadoForm(equipamento_id) 

そのequipamento_idに関連する精巣をフィルタリングすることができますが、私はインラインリレーションシップを作成できません。どうしてこれなの? querysetを作るために、そのequipamento_idをinlineformsetに渡すにはどうすればいいですか?ここでは、フォームが初期化されている場所です問題

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

だ...

+0

フルstacktrceと – e4c5

+0

更新フォーム... @のe4c5であなたの質問を更新するには、私は – user2466766

+0

があなたのviews.py内のライン37の周りに数行を投稿し得るラインから30 45 – e4c5

答えて

1

を助けてください。フォームの__init__メソッドに渡される最初のパラメーターは、String型のクラス名です。あなたの__init__この

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

のように見えますが、最初のパラメータは、ここではequipamento_idであり、それは「ResultadoForm」割り当てられていますが、あなたはクエリフィルタの次の行に整数としてそれを使用しています。したがって、エラー。 modelform_factoryのソースコードを見ると、inlineformset_factory経由で実際にどのようにパラメータとしてequipamento_idを渡すかは不明です。

あなたは

equipamento_id = kwargs.pop('equipamento_id') 

ような何かをしようとする必要があります。しかし、私は、これはinlineform_setを介して送信することができますかわかりませんよ。

+0

ありがとうございます。それは非常に明確だった。私はいくつかの基本的な知識が不足していて、パラメータの種類を混乱させました。私は提案された変更を試みましたが、まだ運がありません。あなたがライトだったので、私は別のエラーを取得しています。誰かが私にこの特定の問題の解決策をまだ与えることができると期待していますが、あなたの答えは間違いなくそのエラーを解決してくれると期待しています。 – user2466766

+0

はい、あなたはそれを開いたままにする権利があります。しかし、アップヴォートは感謝して感謝するでしょう:)。また、新しい質問を投稿することをお勧めします。その新しい質問では、「ビューで渡されたオブジェクトIDに基づいて、フォーム上で外部キー選択オプションをフィルタリングする必要があります」と言うことができます。 inline_formsetを試しましたが、フォームにパラメータを渡すのが難しいと感じました。 – e4c5

+0

私はあなたの答えに印をつけます。私はあなたが示唆したように私は別の質問を投稿したので、私はそれを解決することができました。あなたのヒントは私にこの問題を解決することを許可しましたので、どうもありがとうございます。そのトリックは、@ Shang Wangの答えに続いてformset = ArticleFormSet(form_kwargs = {'user':request.user})を実行することでした。 – user2466766