femiir
femiir

Reputation: 310

django not displaying error_messages in forms

i am new to django and i have this form i am working on i have tried everything possible i cant seem to display the form error messages. i have tried using a def clean method nothing happens when i try to submit an empty form..i have tired switing to using FormView i have also tried using function view i have tried using a for loop and adding {{ form.non_field_errors }} in my template nothing pops up.

my app/forms.py

from django import forms

class ContactForm(forms.Form):

    name = forms.CharField( label='Your Name', min_length=2, max_length=25, required=True, error_messages ={'required':'Please tell Oluwafemi your name'})
    email = forms.EmailField(label='Your Email', required=True, error_messages={'invalid':'Please fill in a valid email'})
    subject = forms.CharField(label='Subject', min_length=4, max_length=100, required=True)
    message = forms.CharField(widget=forms.Textarea(attrs={'placeholder':'Write Oluwafemi a Message'}), error_messages ={'required':'Please write something for Oluwafemi'})

my app/views.py

from django.views.generic import TemplateView
from django.shortcuts import render
from django.core.mail import send_mail
from .forms import ContactForm
from django.http import HttpResponseRedirect

# Create your views here.
class ProfilePageView(TemplateView):
    template_name = 'femi_profile.html'
    form_class = ContactForm
    success_url = 'femiir'

    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)

        if form.is_valid():
            name = form.cleaned_data['name']
            email = form.cleaned_data['email']
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']

            # Send the email
            send_mail(
                f"{subject} - message from {name} ", # message subject
                message, # Message Body
                email, # Sender's mail (From mail)
                ['[email protected]'], # Reciever's mail(To mail)
            )

            return HttpResponseRedirect('femiir')


        return render(request, self.template_name, {'form': form})

snippet of my html template

<div class="col-lg-7 mt-5 mt-lg-0 d-flex align-items-stretch">
            <form method="post">
              {% csrf_token %}
              
              <div class="form-row">
                <div class="form-group col-md-6">
                  {{ form.name|as_crispy_field }}
                </div>
                <div class="form-group col-md-6">
                  {{ form.email|as_crispy_field }}
                </div>
              </div>
              <div class="form-group">
                {{ form.subject|as_crispy_field }}
                {{ form.message|as_crispy_field }}
              </div>
              <div class="text-center"><button type="submit" class="btn btn-primary ">Send Message</button></div>
            </form>
          </div>

please what i my doing wrong

Upvotes: 1

Views: 1469

Answers (2)

Niketan
Niketan

Reputation: 74

Did you try looping through form.errors in template?

{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
          {{ error }}  
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        {{ error }}
    {% endfor %}
{% endif %}

Upvotes: 2

jaandaldethu
jaandaldethu

Reputation: 63

When you are rendering fields manually you would have to use error tags.

{{ form.name_of_field.errors }}

        <form method="post">
           {% csrf_token %}
          
          <div class="form-row">
            <div class="form-group col-md-6">
              {{ form.name|as_crispy_field }}
              {{ form.name.errors}}

            </div>
            <div class="form-group col-md-6">
              {{ form.email|as_crispy_field }}
              {{ form.email.errors}}

            </div>
          </div>
          <div class="form-group">
            {{ form.subject|as_crispy_field }}
              {{ form.subject.errors}}

            {{ form.message|as_crispy_field }}
              {{ form.message.errors}}

          </div>
          <div class="text-center"><button type="submit" class="btn btn-primary ">Send Message</button></div>
        </form>

https://docs.djangoproject.com/en/dev/topics/forms/#rendering-fields-manually

Upvotes: 0

Related Questions