2017-02-11 72 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并且显式默认值(将初始选择默认值),则不会包含空白选项。