Django - 如何使用modelform迭代选项?

时间:2017-02-11 04:31:15

标签: jquery python django forms

我在这里遇到问题,希望你能帮忙..

这就是我想要实现的目标。

基本上我有一个小的Web应用程序,我有3个表单。

我要求nameage的一个主要表单 一个老人的形式和另一个年轻人的形式

我将在模板中看到的第一个表单将是第一个表单,我将在其中输入name并选择是否是一个老人或年轻人。

在我选择youngold后,如果我输入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 个答案:

答案 0 :(得分:2)

问题出在您__init__的{​​{1}}方法中。您正在从模型的条目中设置选项。

personForm

相反,你应该让django从模型字段选择中选择你的选择。为此,您根本不必定义self.fields['age'].choices = [(e.id, e.age) for e in Person.objects.all()] 方法。来自docs

  

如果模型字段已设置选项,则表单字段的窗口小部件将设置为“选择”,其中的选项来自模型字段的选项。选项通常包括默认选择的空白选项。如果该字段是必需的,则强制用户进行选择。如果模型字段为空白= False且显式默认值(最初将选择默认值),则不包括空白选项。