【问题标题】:Django - How can I iterate over the options with modelform?Django - 如何使用模型形式迭代选项?
【发布时间】:2017-02-11 04:31:15
【问题描述】:

我这里有问题希望你能帮忙..

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

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

我要求nameage 的主要形式 一种给老人的形式,另一种给年轻人的形式

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

一旦我选择youngold,它就会按预期工作,如果我输入old,它将用Jquery 显示相应的form,我会看到老人的表格,如果我输入年轻的我'会看到年轻人的表格。

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 ,它没有按预期显示我的选择..

我怎样才能让它运作良好?

提前致谢!

【问题讨论】:

  • 您的Person 表中目前有任何条目吗?看起来您正在使用该表中的项目作为您的选择。
  • 如果你只想显示老和年轻,删除 personForm__init__ 方法应该可行,因为 django 将从你的模型字段中选择选项。

标签: jquery python django forms


【解决方案1】:

问题出在personForm__init__ 方法中。您正在从模型的条目中设置选择。

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

相反,您应该让 django 从模型字段选项中进行选择。为此,您根本不必定义 __init__ 方法。来自docs

如果模型字段设置了选项,则表单字段的小部件将设置为选择,选项来自模型字段的选项。选项通常包括默认选择的空白选项。如果该字段是必需的,这将强制用户进行选择。如果模型字段具有 blank=False 和显式默认值(最初将选择默认值),则不会包含空白选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2011-11-09
    • 2021-12-09
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多