Search code examples
pythondjangoformsemailemailfield

How to display error message for invalid email address using django


I have a problem with displaying error message when the user enters invalid email address.

This is my forms.py file:

from django import forms
from .models import Contact
from django.db import models


class ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        fields = [
            'name',
            'email',
            'message',
        ]

    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        self.fields['name'].widget = forms.TextInput(attrs={
            'placeholder': 'Name', 
            'required': True})

        self.fields['email'].widget = forms.TextInput(attrs={
            'placeholder': 'Email',
            'required': True})

        self.fields['message'].widget = forms.Textarea(attrs={
            'placeholder': 'Message',
            'rows': 6,
            'required': True})

This is my models.py file

from django.db import models
from django import forms
from django.core.validators import EmailValidator

# Create your models here.
class Contact(models.Model):
    name = models.CharField(max_length = 50)
    email = models.EmailField(blank = False, max_length = 200)
    message = models.TextField(blank = False)

This is my views.py file:

from django.shortcuts import render, redirect, render_to_response
from django.http import HttpResponseRedirect

from .models import Contact
from .forms import ContactForm
from django.contrib import messages

# Create your views here.

def contact_create(request):
    form = ContactForm(request.POST or None)
    if form.is_valid():
        instance = form.save(commit = False)
        instance.save()
        form = ContactForm()
        messages.success(request, 'Your message was sent successfully. We will contact you shortly.')
        return HttpResponseRedirect('/home/#contact')

    context = {
        "form": form,
    }

    return render(request, 'index.html', context)

And finally my form in index.html file

{% include "messages_display.html" %}
<form method="POST" action="">
    {% csrf_token %}
    <div class="row half">

        <div class = "6u" > {{ form.name }} </div>
        <div class = "6u" > {{ form.email }} </div>

    </div>
    <div class="row half">
        <div class="12u"> {{ form.message }} </div>
    </div>
    <div class="row">
        <div class="12u">
            <ul class="actions">
                <input type="submit" class="button" value="Send Message" />
            </ul>
        </div>
    </div>
</form>

So, message.success is displayed fine, no problem there, and I would like, if the user enters invalid email address, under the email field to show an error message, just like when name field or message field are left empty, it is displaying "Please fill out this field".

Thank you, for your help.


Solution

  • To display an error message for the mail field, your form's email field should be forms.EmailInput

    So, your forms.py file should be:

    from django import forms
    from .models import Contact
    from django.db import models
    
    
    class ContactForm(forms.ModelForm):
        class Meta:
            model = Contact
            fields = [
                'name',
                'email',
                'message',
            ]
    
        def __init__(self, *args, **kwargs):
            super(ContactForm, self).__init__(*args, **kwargs)
            self.fields['name'].widget = forms.TextInput(attrs={
                'placeholder': 'Name', 
                'required': True})
    
            self.fields['email'].widget = forms.EmailInput(attrs={
                'placeholder': 'Email',
                'required': True})
    
            self.fields['message'].widget = forms.Textarea(attrs={
                'placeholder': 'Message',
                'rows': 6,
                'required': True})