How to add class, id, placeholder attributes to a field in django model forms

前端 未结 9 2054
既然无缘
既然无缘 2020-12-05 00:12

I have a django model like below

models.py

class Product(models.Model):
    name = models.CharField(max_length = 300)
    descripti         


        
相关标签:
9条回答
  • 2020-12-05 00:23

    Adding to answer from Derick Hayes I created a class BasicForm which extends forms.ModelForm that adds the bootstrap classes to every form that extends it.

    For my forms I just extend BasicForm instead of model form and automatically get bootstrap classes on all forms. I went a step further and append the classes to any custom css classes which may already be there.

    class BaseModelForm(forms.ModelForm):
    
    def __init__(self, *args, **kwargs):
        super(BaseModelForm, self).__init__(*args, **kwargs)
        # add common css classes to all widgets
        for field in iter(self.fields):
            #get current classes from Meta
            classes = self.fields[field].widget.attrs.get("class")
            if classes is not None:
                classes += " form-control"
            else:
                classes = "form-control"
            self.fields[field].widget.attrs.update({
                'class': classes
            })
    
    0 讨论(0)
  • 2020-12-05 00:35

    You can do the following:

    #forms.py
    class ProductForm(ModelForm):
        class Meta:
            model = Product
            exclude = ('updated', 'created')
    
        def __init__(self, *args, **kwargs):
            super(ProductForm, self).__init__(*args, **kwargs)
            self.fields['description'].widget = TextInput(attrs={
                'id': 'myCustomId',
                'class': 'myCustomClass',
                'name': 'myCustomName',
                'placeholder': 'myCustomPlaceholder'})
    
    0 讨论(0)
  • 2020-12-05 00:43

    I really like Dmitriy Sintsov's answer but it doesn't work. Here's a version that does work:

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in iter(self.fields):
            self.fields[field].widget.attrs.update({
                'class': 'form-control'
        })
    

    update

    add this condition for better

    if self.fields[field].widget.__class__.__name__ in ('AdminTextInputWidget' , 'Textarea' , 'NumberInput' , 'AdminURLFieldWidget', 'Select'): 
         self.fields[field].widget.attrs.update({ 'class': 'form-control' })
    
    0 讨论(0)
  • 2020-12-05 00:44

    You can update forms.py as below

    class ProductForm(ModelForm):
        class Meta:
            model = Product
            exclude = ('updated', 'created')
            widgets={
                       "name":forms.TextInput(attrs={'placeholder':'Name','name':'Name','id':'common_id_for_imputfields','class':'input-class_name'}),
                       "description":forms.TextInput(attrs={'placeholder':'description','name':'description','id':'common_id_for_imputfields','class':'input-class_name'}),
                    }  
    
    0 讨论(0)
  • 2020-12-05 00:44

    add_class filter for adding a CSS class to form field:

     {% load widget_tweaks %}     
        <form enctype="multipart/form-data" action="{% url 'add_a_product' %}" method="post">
                     <div id="name">
                       {{form.name|add_class:"input-calss_name"}}
                     </div> 
                     <div id="description">
                       {{form.description|add_class:"input-calss_name"}}
                     </div> 
               </form> 
    

    django-widget-tweaks library

    0 讨论(0)
  • 2020-12-05 00:46

    Slightly modified version of excellent mariodev answer, adding bootstrap class to all form fields, so I do not have to re-create form input widgets for each field manually (short Python 3.x super()):

    class ProductForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            for field in self.fields:
                self.fields[field].widget.attrs.update({
                    'class': 'form-control'
                })
    
    0 讨论(0)
提交回复
热议问题