【问题标题】:How to combine dynamically created fields with standard django form?如何将动态创建的字段与标准 django 表单结合起来?
【发布时间】:2018-03-05 11:26:00
【问题描述】:

我使用简单的 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 表单中?

【问题讨论】:

  • 只需将它们直接添加到您的表单中(如果它们不是您的模型的一部分,则不在Meta 中):unit = CharField() 等...当您使用 @987654325 初始化表单时@data,这些字段将获取发布的值。然后,您可以在视图中使用form.cleaned_data['unit'] 将其保存在某处。
  • 您还需要将表单字段显式添加到模板中,而不是使用{{ form }}。或者,您可以添加自定义 CSS 属性,例如 hide,以便不会呈现自动生成的 HTML 字段,因为您已经手动添加它们。

标签: jquery python ajax django forms


【解决方案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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2019-11-08
  • 2018-04-24
  • 2015-04-01
  • 1970-01-01
相关资源
最近更新 更多