Asi*_*sif 8 python django django-templates django-forms django-views
我有表单字段{{form.item}},它将呈现给
<input type="text" name="item" >
Run Code Online (Sandbox Code Playgroud)
如何使用自定义模板标记更改表单字段的名称属性?
我尝试将表单发送到模板标签
form.fields['item'].widget.attrs['name'] = 'new_name'
Run Code Online (Sandbox Code Playgroud)
但我没有成功.
我需要在模板中更改name属性.
UPDATE
models.py
class A(models.Model):
name = models.CharField(50)
type = models.CharField(50)
class B(models.Model):
field1 = ForeignKeyField(A)
value = IntegerField()
Run Code Online (Sandbox Code Playgroud)
views.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,
}
Run Code Online (Sandbox Code Playgroud)
模板
<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>
Run Code Online (Sandbox Code Playgroud)
现在在自定义模板标签中,我需要为内联formset的每个字段分配新名称
form.fields['new_name'] = form.fields['item']
del form.fields['item']
Run Code Online (Sandbox Code Playgroud)
我已经用几种不同的方式对此进行了测试,它适用于多种类型的表单字段。
使用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
Run Code Online (Sandbox Code Playgroud)
您可以根据需要对任何小部件类进行子类化,并创建您自己的“渲染方法”。示例位于 PATH_TO_YOUR_DJANGO/django/forms/forms.py
class CustomNameTextInput(TextInput):
def render(self, name, value, attrs=None):
if 'name' in attrs:
name = attrs['name']
del attrs['name']
return super(TextInput, self).render(name, value, attrs)
class MyForm(Form):
item = CharField(widget=CustomNameTextInput, attrs={'name':'my_name'})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19358 次 |
| 最近记录: |