2017-05-08 10 views
0

に動的変数を設定したい、私は__init__を使って動的変数を渡しました。私はforms.pyのコードが正しいと思います問題はビューで変数を渡す方法ですか?私の一般的なビューまたはurlからforms.pyのquerysetに変数を設定します

forms.py

class ContainerForm(forms.ModelForm): 
    vehicle=forms.ModelChoiceField(required=False,queryset=Vehicle.objects.all(),widget=forms.Select(attrs={'class':'form-control'})) 

    def __init__(self, *args, **kwargs): 
     vehicle_id = kwargs.pop('vehicle_id',None) 
     super(ContainerForm, self).__init__(*args, **kwargs) 
     if vehicle_id: 
      self.fields['vehicle'].queryset = Vehicle.objects.filter(id=vehicle_id) 

views.py

class ContainerCreate(CreateView): 
    form_class = ContainerForm(id= vehicle_id) 
    template_name = 'vehicule_app/container_form.html' 

エラーは言った:

Exception Value:'ContainerForm' object is not callable 
+1

誤差があるが、あなたは、インスタンスをインスタンス化されています

class ContainerForm(forms.ModelForm): class Meta: model = Container def __init__(self, *args, **kwargs): vehicle_id = kwargs.pop('vehicle_id') self.fields['vehicle'].queryset = Vehicle.objects.filter(id=vehicle_id) 

次にget_form_kwargs方法では、代わりにkwargsからするvehicle_idを追加します。あなたはさらに助けることができる十分なコードを含んでいません。 'vehicle_id'はどこから来たのですか?どのように 'id'がフォームで使われていますか? – Alasdair

+0

あなたは正しいです、vehicle_idは私のモデルから来ています車 –

+0

それは理にかなっていません。あなたの質問では、あなたは 'vehicle_id'を使っていますが、どこにも定義していません。値はどこから来るのですか? URL?その場合は、URLパターンを表示します。あなたはまた、 'id'がモデルフォームによってどのように使われているかを示していません。 – Alasdair

答えて

0

あなたはURLからvehicle_idを使用したい場合、次にy OUは、モデルのフォームからフィールドを除外することができます。

class ContainerForm(forms.ModelForm): 
    class Meta: 
     model = Container 
     exclude = ['vehicle'] 

をあなたはその後、self.kwargsからパラメータを取得し、get_form_kwargsにフォームのインスタンスに値を設定することができます。

class ContainerCreate(CreateView): 
    form_class = ContainerForm 
    template_name = 'vehicule_app/container_form.html' 

    def get_form_kwargs(self): 
     kwargs = super(ContainerCreate, self).get_form_kwargs() 
     if kwargs['instance'] is None: 
      kwargs['instance'] = Container() 
      kwargs['instance'].vehicle_id = self.kwargs['pk'] # Fetch the vehicle_id from the URL 
     return kwargs 

注上記のコードがすることURLからIDを検証しないでください。ユーザーは好みの値に変更できます。

vehicleフィールドをフォーム内に1つの選択肢で保持する場合は、__init__メソッドをオーバーライドし、クエリーセットを設定します。 form_class`はフォームクラスでなければなりません `ので

class ContainerCreate(CreateView): 
    form_class = ContainerForm 
    template_name = 'vehicule_app/container_form.html' 

    def get_form_kwargs(self): 
     kwargs = super(ContainerCreate, self).get_form_kwargs() 
     kwargs['vehicle_id'] = self.kwargs['pk'] 
     return kwargs 
+0

ありがとう、私は理解している私は私の一般的なビューにこのコードを追加しますが、forms.pyについては、私はsomethingsを変更する必要がありますか? –

+0

あなたは私のポストを見てください、私はすべてのforms.py –

+0

あなたに感謝、それは働いているのを表示するためにそれを更新してください –

関連する問題