0

ビューの状態を確認した後に動的フォームを作成しようとしていますが、そのアプローチ方法がわかりません。どのように私のビューからフォームのメタクラスのフィールド属性を設定するのですか?ビューを使用してModelFormのメタクラスフィールドを動的に更新します。

以下は私のviews.pyと私のforms.pyファイルです。私は私の意見からforms.py内のフィールドのリストを作成するにはどうすればよい

views.py

from django.shortcuts import render, get_object_or_404 
    from django.http import HttpResponse 
    from django import forms 

    from .models import Master, Label, Assosiative 
    from .forms import LabelForm, MzasterForm, AssosiativeForm 

    def master(request,pk): 
     associate = get_object_or_404(Assosiative, pk=pk) 
     form = MasterForm(request.POST or None) 
     if associate.short_text1 == 1: 
      form.fields['short_text1'] = forms.CharField(label='Short text 1') 
     if associate.short_text2 == 1: 
      form.fields['short_text2'] = forms.CharField(label='Short text 2') 
     if associate.short_text3 == 1: 
      form.fields['short_text3'] = forms.CharField(label='Short text 3') 
     if associate.short_text4 == 1: 
      form.fields['short_text4'] = forms.CharField(label='Short text 4') 
     if associate.num_field1 == 1: 
      form.fields['num_field1'] = forms.CharField(label='Number field 1') 
     if associate.num_field2 == 1: 
      form.fields['num_field2'] = forms.CharField(label='Number field 2') 
     if form.is_valid(): 
      try: 
       short_text1 = form.cleaned_data['short_text1'] 
       short_text2 = form.cleaned_data['short_text2'] 
       short_text3 = form.cleaned_data['short_text3'] 
       short_text4 = form.cleaned_data['short_text4'] 
       num_field1 = form.cleaned_data['num_field1'] 
       num_field2 = form.cleaned_data['num_field2'] 
       form.save() 
      except Exception, ex: 
     return HttpResponse("Error %s" %str(ex)) 
     return render(request, 'master.html', {'form':form,}) 

forms.py

私は私が私の見解からthis questionと同様に

def masterForm(fields_list, *args, **kwargs): 
     class MasterForm(forms.ModelForm): 
      class Meta: 
       model = Master 
       fields = fields_list 
      def __init__(self): 
       super(MasterForm, self).__init__(*args, **kwargs) 
     return MasterForm() 
    joke = masterForm(('short_text1',)) 
+0

[この質問](http://stackoverflow.com/questions/297383/dynamically -update-modelforms-meta-class)が役に立ちます。 – Alasdair

+0

私はその質問が説明どおりに実装しようとしましたが、それでも動作しません。 – Hamfri

+2

"うまくいかない"とは何ですか?より単純なバージョンの 'def get_form(exclude_list):'を試してみてください。フォームクラスを作成した後、それを2つの別々のステップとしてインスタンス化するともっと明確になると思います。 – Alasdair

答えて

0

をフィールドに入力することができるように、ここで何をすべきかわからない、あなたが作成するメソッドを定義することができますフォームクラス。あなたのビューを見ると、フィールドのリストを作成するのではなく、associateに基づいて1つずつフィールドを作成するように見えます。したがって、私はあなたのget_form_classメソッドの引数としてassociateを使用します。

def get_form_class(fields_list): 
    class MasterForm(ModelForm): 
     class Meta: 
      model = Master 
      fields = fields_list 
     ... 
    return MasterForm 

次に、あなたのビューでは、動的にフォームクラスを作成するためにget_formを使用し、それをインスタンス化します。動的にフィールドにフォームフィールドを追加

views.py

def master(request, pk): 
     associate = get_object_or_404(Assosiative, pk=pk) 
     MasterForm = get_form_class(associate) 
     form = MasterForm(request.POST or None) 
     if form.is_valid(): 
      form.save() 
      messages.add_message(request, messages.INFO, 'Your Form has been posted successfully') 
      return HttpResponseRedirect('/') 
     return render(request, 'master.html', locals()) 

いくつかの条件を確認した後、動的にフォームを作成するには

def master(request, pk): 
    associate = get_object_or_404(Assosiative, pk=pk) 
    fields_list = [] 
    if associate.short_text1 == 1: 
     fields_list.append('short_text1') 
    if associate.short_text2 == 1: 
     fields_list.append('short_text2') 
    MasterForm = get_form_class(fields_list) 
    form = MasterForm(request.POST or None) 
    if form.is_valid(): 
     ... 
+0

あなたの答えは私を助けましたが、私は少し以下のコードのように微調整しなければなりませんでした – Hamfri

+0

あなたの答えが私を助けてくれてありがとう。私が持っている唯一の問題は、私がデータを投稿するときにデータベースにnull値として投稿され、**フィールドに[**] **フィールドが含まれていない場合でも**クラスのMeta ** djangoが不満になることです**作成'fields'属性または 'exclude'属性のないModelFormは禁止されています。フォームのマスターフォームを更新する必要があります。** – Hamfri

+0

'class Master(models.Model): short_text1 = models.CharField(max_length = 100、空白= True、null = True) short_text2 = models.CharField(max_length = 100、blank = True 、ヌル= TRUE) short_text3 = models.CharField(MAX_LENGTH = 100、ブランク=真、ヌル= TRUE) short_text4 = models.CharField(MAX_LENGTH = 100、ブランク=真、ヌル= TRUE) num_field1 = models.IntegerField(空白= True、null = True) num_field2 = models.IntegerField(空白= True、null = True) ' – Hamfri

0

はforms.py

def get_form_class(associate, *args, **kwargs): 
     class MasterForm(forms.ModelForm): 
      def __init__(self, *args, **kwargs): 
       super(MasterForm,self).__init__(*args, **kwargs) 
      class Meta: 
       model = Master 
       fields = [] #initialize an empty fields list 
       # Append items to the fields list after checking some condition 
       if associate.short_text1 == 1: 
        fields.append('short_text1') 
       if associate.short_text2 == 1: 
        fields.append('short_text2') 
       if associate.short_text3 == 1: 
        fields.append('short_text3') 
       if associate.short_text4 == 1: 
        fields.append('short_text4') 
       if associate.num_field1 == 1: 
        fields.append('num_field1') 
       if associate.num_field2 == 1: 
        fields.append('num_field2')    
     return MasterForm 
クラスメタを一覧表示します
関連する問題