2017-02-11 69 views
0

我在這裏有一個問題,我希望你能幫助..Django - 我如何迭代modelform的選項?

這是我想要實現的。

基本上我有一個小的web應用程序,我有3種形式。在這裏我要請nameage 一種形式爲老人和一種形式爲一年輕男子

第一種形式,我會在模板中看到的將是第一種形式

主要形式之一,在那裏我會輸入name並選擇它是老年人還是年輕人。

,使其按預期工作,一旦我選擇youngold它會與jQuery相應form顯示,如果我進入old我會看到形式的老人,如果我進入年輕的時候會看到一個年輕人的形式。

jQuery和一切工作,除了由第一種形式確定..

所有我需要的是展示我的第一種形式的模板爲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

目前您的「人」表中是否有任何條目?看起來你正在使用該表中的項目作爲你的選擇。 – anupsabraham

+1

如果你只是想顯示老的和年輕的,刪除'personForm'的'__init__'方法應該工作,因爲Django會從你的模型字段中選擇選項。 – anupsabraham

回答

2

問題出在您的personForm__init__方法中。您正在從模型的條目中設置選項。

self.fields['age'].choices = [(e.id, e.age) for e in Person.objects.all()] 

相反,您應該讓django從模型字段選擇中選擇您的選擇。爲此,您不必定義一個__init__方法。從docs

如果模型字段有選擇設置,那麼表單字段的小部件將被設置爲Select,並且選擇來自模型字段的選擇。這些選項通常包括默認選擇的空白選項。如果該字段是必需的,則強制用戶進行選擇。如果模型字段爲空= False並且顯式默認值(將初始選擇默認值),則不會包含空白選項。