Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change the name attribute of form field in django template using

I have form field {{form.item}} which will render to

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

How can i change the name attribute of the form field using custom template tags?

I tried by sending the form to template tag where

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

But I'm not getting success.

I need to change the name attribute in template.

UPDATE

models.py

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

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

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,
       }

template

  <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>

Now in custom template tag i need to assign new name for each field of inline formset

like image 503
Asif Avatar asked Aug 14 '12 06:08

Asif


People also ask

What is form Is_valid () in Django?

The is_valid() method is used to perform validation for each field of the form, it is defined in Django Form class. It returns True if data is valid and place all data into a cleaned_data attribute.

What does {% %} mean in Django?

{% %} and {{ }} are part of Django templating language. They are used to pass the variables from views to template. {% %} is basically used when you have an expression and are called tags while {{ }} is used to simply access the variable.

How do I add a class or id attribute to a Django form field?

In order to add a class or id attribute to a form in Django, we have to place a widget=form. TextInput (or widget= form. EmailInput, if email input) within the form field (because it's a text field). Inside of this widget, we then have to put, attrs={'class':'some_class'}.


2 Answers

form.fields['new_name'] = form.fields['item']
del form.fields['item']
like image 127
Sergey Lyapustin Avatar answered Sep 26 '22 00:09

Sergey Lyapustin


I've tested this a few different ways, and it works with many types of Form Fields.

Use set_field_html_name(...) on every Field you want to set the name on.

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
like image 29
HelpyHelperton Avatar answered Sep 27 '22 00:09

HelpyHelperton