使用更改django模板中表单字段的名称属性

新手上路,请多包涵

我有表单字段 {{form.item}} 将呈现给

        <input type="text" name="item" >

如何使用自定义模板标签更改表单字段的名称属性?

我尝试将表单发送到模板标签

       form.fields['item'].widget.attrs['name'] = 'new_name'

但我没有成功。

我需要更改模板中的名称属性。

更新

模型.py

 class A(models.Model):
     name = models.CharField(50)
     type = models.CharField(50)

class B(models.Model):
     field1 = ForeignKeyField(A)
     value = IntegerField()

视图.py

  def saving_calculation(request):

    SavingFormset = modelformset_factory(A, extra=2)
    OfferInlineFormSet = inlineformset_factory(
                     A, B,
                     extra = 4
                     )

   if request.method == 'POST':
      pass
   else:
       offer_formset = OfferInlineFormSet()
       saving_formset = SavingFormset(queryset=SavingCalculation.objects.none())

   return render_to_response(
       'purchasing/saving_calculation.html',
       {
       'offer_formset':offer_formset,
       'saving_formset':saving_formset,
       }

模板

  <form action="." method="POST">
  {{ offer_formset.management_form }}
  {{ saving_formset.management_form }}
  {{ saving_formset.prefix }}
  <table>
 <thead>
    <tr>
        <th>Business Unit</th>
    <th>Category</th>
    <th>Buyer</th>
    <th>Offer1</th>
    <th>Offer2</th>
    <th>Offer3</th>
    <th>Offer4</th>
    </tr>
     </thead>
 <tbody>
        {% for saving in saving_formset.forms %}
     <tr>
    <td>{{saving.businessunit}}</td>
    <td>{{saving.type_of_purchase}}</td>
    <td>{{saving.buyer}}</td>
    {% for offer in offer_formset.forms %}
        <td>{{ offer|set_field_attr:forloop.counter0 }}</td>
    </tr>
        {% endfor %}

     {% endfor %}

      </tbody>
     </table>
     <input type="submit" value="Save" />
    </form>

现在在自定义模板标签中,我需要为内联表单集的每个字段分配新名称

原文由 Asif 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 392
1 个回答

我已经用几种不同的方式对此进行了测试,并且它适用于多种类型的表单字段。

在要设置名称的每个字段上使用 set_field_html_name(...)

 from django import forms
from django.core.exceptions import ValidationError

def set_field_html_name(cls, new_name):
    """
    This creates wrapper around the normal widget rendering,
    allowing for a custom field name (new_name).
    """
    old_render = cls.widget.render
    def _widget_render_wrapper(name, value, attrs=None):
        return old_render(new_name, value, attrs)

    cls.widget.render = _widget_render_wrapper

class MyForm(forms.Form):
    field1 = forms.CharField()
    # After creating the field, call the wrapper with your new field name.
    set_field_html_name(field1, 'new_name')

    def clean_field1(self):
        # The form field will be submit with the new name (instead of the name "field1").
        data = self.data['new_name']
        if data:
            raise ValidationError('Missing input')
        return data

原文由 HelpyHelperton 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题