2017-02-11 13 views
0

私はあなたが助けてくれることを願っています。ここに問題があります。Django - modelformでオプションを反復処理するにはどうすればよいですか?

ここで私が達成しようとしていることがあります。

基本的に私は3つのフォームがある小さなウェブアプリケーションを持っています。私は若い男

私は最初の形式になりますテンプレートに表示されます最初のフォームのための老人のためのnameage 一つの形と1つの以上のフォームのために求めている

1メインフォーム、ここで私はnameと入力し、それが古いか若い男かを選択します。予想通り、それは私がyoungまたはoldを選択したら、それは私がoldを入力する場合、私は老人のためのフォームが表示されますし、私は若い入力した場合、私は若い男のためのフォームが表示されますform対応するjQueryを使って表示されます動作させるために

jQueryとすべてが最初のフォーム..

による場合を除いて、[OK]働く私に必要なのはmodelformように、テンプレートの私の最初のフォームを表示することです。

正常な形で正常に動作させることができますが、agenameをデータベースに保存する必要があります。

は、ここに私のモデルです:

AGES = (
('OLD', 'OLD'), 
('YOUNG', 'YOUNG '), 
) 


class Person(models.Model): 
    name = models.TextField() 
    age = models.CharField(max_length=128,choices=AGES, default=True) 

    def __str__(self): 
     return self.name 

class Questions_old(models.Model): 
    person = models.ForeignKey(Person) 
    country = models.TextField() 
    hobbies = models.TextField() 

    def __str__(self): 
     return self.person.name 


class Questions_young(models.Model): 
    person = models.ForeignKey(Person) 
    country = models.TextField() 
    parents = models.TextField() 

    def __str__(self): 
     return self.person.name 

私形式:

class personForm(forms.ModelForm): 
    class Meta: 
     model = Person 
     fields = ["age","name"] 

    def __init__(self, *args, **kwargs): 
     super(personForm, self).__init__(*args, **kwargs) 
     self.fields['age'].choices = [(e.id, e.age) for e in Person.objects.all()] 

class person_oldForm(forms.ModelForm): 
    class Meta: 
     model = Questions_old 
     exclude = ('name',) 
     fields = ['country','hobbies'] 

class person_youngForm(forms.ModelForm): 
    class Meta: 
     model = Questions_young 
     exclude = ('name',) 
     fields = ['country','parents'] 

ビュー:

def person_form(request): 
    form1 = personForm(request.POST or None) 
    form2 = person_oldForm(request.POST or None) 
    form3 = person_youngForm(request.POST or None) 
    queryset1 = Person.objects.all() 
    queryset2 = Questions_old.objects.all() 
    queryset3 = Questions_young.objects.all() 
    context = { 
    "form1": form1, 
    "form2": form2, 
    "form3": form3, 
    "queryset1": queryset1, 
    } 
    form1_valid = form1.is_valid() 
    form2_valid = form2.is_valid() 
    form3_valid = form3.is_valid() 
    if form1.is_valid(): 
     person = form1.save() 
     if form2_valid: 
      qo = form2.save(commit=False) 
      qo.person = person 
      qo.save() 
     if form3_valid: 
      qy = form3.save(commit=False) 
      qy.person = person 
      qy.save() 
    return render(request, "person.html", context) 

テンプレート:

<div class="form-group"> 
<select id="age" name="age"> 
{% for x,y in form.fields.age.choices %} 
    <option value="{{ x }}"{% if form.fields.age.value == x %} selected{% endif %}>{{ y }}</option> 
{% endfor %} 
</select> 
</div> 



     <div id="form" class="ages" style="display:none;"> 
     <form method="POST" action="">{% csrf_token %} 
      {{ form2|crispy }} 
    <button type="submit" name="submit" class="btn btn-success btn-xs"> 
     <span class="fa fa-floppy-o"></span> Guardar 
    </button> 
     </form> 
     </div> 

     <div id="form1" class="ages" style="display:none;"> 
     <form method="POST" action="">{% csrf_token %} 
      {{ form3|crispy }} 
    <button type="submit" name="submit" class="btn btn-success btn-xs"> 
     <span class="fa fa-floppy-o"></span> Guardar 
    </button> 
     </form> 
     </div> 


     <script> 
     $('#age').on('change',function(){ 
     if($(this).val()==="old"){ 
      $("#form").show() 
     } 
     else{ 
      $("#form").hide() 
     } 
     if($(this).val()==="young"){ 
      $("#form1").show() 
     } 
     else{ 
      $("#form1").hide() 
     } 
     }); 

    </script> 

私のコードを実行すると、空のselectが表示されていますが、私の選択が期待どおりに表示されません。

どうすればうまく動作させることができますか?

ありがとうございます!

+1

現在、「Person」テーブルにエントリがありますか?そのテーブルの項目を選択肢として使用しているようです。 – anupsabraham

+1

古いものと若いものを表示したいだけなら、djangoはモデルフィールドから選択肢を選ぶので、 'personForm'の' __init__'メソッドを削除するとうまくいくはずです。 – anupsabraham

答えて

2

問題はpersonForm__init__メソッドにあります。モデルのエントリから選択肢を設定しています。

代わりに、djangoがモデルフィールドの選択肢から選択するようにしてください。そのためには、__init__メソッドをまったく定義する必要はありません。 docsから:

モデルフィールドにchoicesが設定されている場合は、フォームフィールドのウィジェットはモデルフィールドの選択肢から選択して、選択するように設定されます。選択肢には通常、デフォルトで選択されている空白の選択肢が含まれます。フィールドが必要な場合は、ユーザーが選択する必要があります。モデルフィールドに空白= Falseと明示的なデフォルト値がある場合は、空白の選択は含まれません(代わりにデフォルト値が最初に選択されます)。

関連する問題