如何将动态创建的字段与标准django表单相结合?

时间:2017-09-24 10:41:12

标签: jquery python ajax django forms

我使用简单的django表单

class MassPaymentForm(forms.ModelForm):


    class Meta:
        model = LeasePayment

        fields = ['payment_type', 'is_deposit',  'amount', 'method', 'payment_date', 'description'] 

在我的模板上,我使用AJAX创建了几个链式下拉列表

      <form method="POST"  class="form" action="" method="get">
        <div class="form-group">
            {% csrf_token %}

            <br><br>
            <b>Building:</b><br>
                <select name="building" id="building" onchange="getunit();">
  <option id="-1">Select building</option>
</select>


<br>
<b>Unit:</b><br>
<select name="unit" id="unit" onchange="getlease();">
  <option id="-1">Select unit</option>
</select>
  <br>
<b>Lease:</b><br>
 <select name="lease" id="lease" onchange="getleaseterm()">
  <option id="-1">Select lease</option>
</select>
  <br>
<b>Term:</b><br>
   <select name="leaseterm" id="leaseterm">
  <option id="-1">Select lease term</option>
</select> 
            {{ form|crispy}}



        {{ form.media }}

            <BR><BR>
            <button type="submit" class="btn btn-primary btn-primary">Save</button>
          </div>
      </form>

我需要'lease'和'leaseterm'作为我的表单的一部分,因为它们是模型中的必填字段。 如何将这些AJAx动态生成的下拉列表作为我的Django表单的一部分?

1 个答案:

答案 0 :(得分:1)

如果它们是您模型的一部分,只需将它们直接添加到您的表单即可。或者,如果模型字段默认为不适用于验证的内容,则直接将其覆盖为标准表单字段。由于您在HTML中显式呈现它们,因此您不希望它们呈现。因此,您应该向窗口小部件添加一个css类以将其隐藏在浏览器中(使用javascript完全删除它们),否则您将拥有两个具有相同名称的输入字段。

class MassPaymentForm(forms.ModelForm):

    unit = CharField(widget=HiddenInput(attrs={'class': 'to-remove'})
    lease = CharField(widget=HiddenInput(attrs={'class': 'to-remove'})
    leaseterm = CharField(required=False, widget=HiddenInput(attrs={'class': 'to-remove'})  # just as an example

    class Meta:
         # rest of Meta class here