Add custom CSS styling to model form django

13,873

Solution 1

Try this:

forms.py

class EmailForm(forms.ModelForm):
    ...
    subject = forms.CharField(
        label = 'Subject',
        max_length = 1000,
        required = True,
        widget = forms.TextInput(
            attrs = {'class': 'summernote', 'name': 'subject'}
        )
    )   

    body = forms.CharField(
        label = 'Body',
        max_length = 1000,
        required = True,
        widget = forms.TextInput(
            attrs = {'class': 'summernote', 'name': 'body'}
        )
    )   
    ...

    class Meta:
        model = MarketingEmails
        fields = ('messageid','subject','body','name', ... )

view.py

from django.shortcuts import render
from your_app_path.forms import EmailForm

def fname(request):
    ...
    marketing = MarketingEmails.objects.get(...)

    form = EmailForm(instance=marketing) 
    ...

    return render(request, 'yourview.html', { 'form': form })

yourview.html

<form action="" method="post">
  {% csrf_token %}
  {% for field in form %}
    {{ field.label_tag }}
    {{ field }}

    {% if field.help_text %}
      {{ field.help_text }}
    {% endif %}

    {% for error in field.errors %}
      {{ error }}
    {% endfor %}

  {% endfor %}
  <button type="submit" class="btn btn-primary">Submit</button>
</form>

Solution 2

In my templates I use Widget Tweaks You can add CSS classes or twitter-bootstrap classes. Its really useful

<form method='POST' action="/" enctype='multipart/form-data'>
 {% load widget_tweaks %}
 {% csrf_token %}
 {{ form.first_name |add_class:"customCSS1 customCSS2" }}
 {{ form.second_name |add_class:"form-control customCSS4" }}
</form>
{{ form.media.js }}

with this plugin you can style the form as you wish. You could add your form-control class or use a personal CSS class like

.customCSS1{
  width60%;
  border-radius:5px;
 }
Share:
13,873

Related videos on Youtube

L. Thompson
Author by

L. Thompson

University placement student learning to code while on the job.

Updated on June 04, 2022

Comments

  • L. Thompson
    L. Thompson almost 2 years

    I am using a bootstrap variant to help style a model form. There is a certain class I would like one of the fields to be and I have read around on the subject and the general consensus is to add a widget to the ModelForm's meta, like I tried below:

    forms.py

    class EmailForm(forms.ModelForm):
        class Meta:
            model = MarketingEmails
            fields = ['messageid','subject','body','name','altsubject','utm_source','utm_content','utm_campaign',]
            widgets = {
                'body': Textarea(attrs={'class': 'summernote'}),
            }
    

    However this doesn't seem to render onto my template, which is:

    <div class="row">
    <div class="col-sm-6">
        <form method="POST" class="post-form" action ="">
        {% csrf_token %}        
            <p><label for="id_subject">Subject</label>
            <input class="form-control" id="id_subject" type="text" name="subject" maxlength="1000" value="{{rows.subject}}"required /></p>
    
            <p><label for="id_name">Name</label>
            <input class="form-control" id="id_name" type="text" name="name" maxlength="1000" value="{{rows.name}}"required /></p>
    
            <p><label for="id_body">Body</label>
            <input class="form-control" id="id_body" type="text" name="body" maxlength="1000" value="{{rows.body}}"required /></p>
    
            <p><label for="id_altsubject">Alt Subject</label>
            <input class="form-control" id="id_altsubject" type="text" name="altsubject" maxlength="1000" value="{{rows.altsubject}}"required /></p>
    
            <p><label for="id_utm_source">utm_source</label>
            <input class="form-control" id="id_utm_source" type="text" name="utm_source" maxlength="1000" value="{{rows.utm_source}}"required /></p>
    
            <p><label for="id_utm_content">utm_content</label>
            <input class="form-control" id="id_utm_content" type="text" name="utm_content" maxlength="1000" value="{{rows.utm_content}}"required /></p>
    
            <p><label for="id_utm_campaign">utm_campaign</label>
            <input class="form-control" id="id_utm_campaign" type="text" name="utm_campaign" maxlength="1000" value="{{rows.utm_campaign}}"required /></p>
    
            <button type="submit" class="save btn btn-default">Save</button>
    
        </form>
    </div>
    

    Is there another way to do this or is there something I have done wrong in my code?

    UPDATE I have followed the suggested of Jacek and now it is styled but the information is no longer displaying, this is my new code:

    forms.py:

    class EmailForm(forms.ModelForm):
    subject = forms.CharField(
        label = 'Subject',
        max_length = 2000,
        required = True,
        widget = forms.TextInput(
            attrs = {'class': 'summernote', 'name': 'subject'}
            )
        )
    
    ... 
    class Meta:
        model = MarketingEmails
        fields = ['messageid','subject','body','name','altsubject','utm_source','utm_content','utm_campaign',]
    

    views.py:

    def emailinfo(request, pk):
    if request.session.has_key('shortname'):
        shortname =  request.session['shortname']
        form = MarketingEmails.objects.filter(messageid =pk).get()
        if request.method == 'GET':
            form = EmailForm(instance=form)
            return render(request, 'marketingemails/emailinfo.html',{'shortname': shortname, 'form': form})
    
        else:
            form = EmailForm(request.POST,instance=form)
            if form.is_valid():
                return redirect('marketingemails:emailinfo', pk = form.messageid)
    
        return render(request, 'marketingemails/emailinfo.html',{'shortname': shortname, 'form': form})
    else:
        return HttpResponseRedirect(reverse('common:login'))    
    

    html:

    <div class="row">
    <div class="col-sm-6">
        <form method="POST" action ="">
        {% csrf_token %}        
        {% for field in form %}
            {{ field.label_tag }}
            {{ field }}
    
            {% if field.help_text %}
                {{ field.help_text }}
            {% endif %}
    
            {% for error in field.errors %}
                {{ error }}
            {% endfor %}
    
        {% endfor %}
        <button type="submit" class="btn btn-primary">Submit</button>
    
        </form>
    </div>
    

  • L. Thompson
    L. Thompson almost 7 years
    I have set the code up like suggested, and now it is styled but the information is not being displayed on the webpage like it was previously, I have added an update on my code - do you know why this is?