Arjun Shahi
Arjun Shahi

Reputation: 7330

how to display form.errors message properly in django

here with this code the form errors are not displaying properly.The all error messages says, this field is required only.how can i define my custom form.error message in the template.

Template:

{% if form.errors %}
  {% for field in form %}
    {% for error in field.errors %}
      <p> {{ error }} </p>
    {% endfor %}
  {% endfor %}
{% endif %}
<div class="form-group">
  <h5>Full Name <span class="text-danger">*</span></h5>
  <div class="controls">
    <input type="text" name="name" class="form-control" title="Full Name is required" > </div>
</div>
<div class="form-group">
  <h5>Courses<span class="text-danger">*</span></h5>
  <div class="controls">
    {% for course in courses %}
      <input name ="courses" type="checkbox" id="course-{{course.id}}" value="{{course.id}}" autofocus  title="Please Check at least one course">
      <label for="course-{{course.id}}">{{course.title}}</label>
    {% endfor %}
  </div>
</div>

views.py:

if request.method == 'POST':
    form = AddStudentForm(request.POST, request.FILES)
    if form.is_valid():
        student = form.save(commit=True)

        student.save()

        messages.success(request, 'student with name  {}  added.'.format(student.name))
        return redirect('admin:add_student')

    else:
        form = AddStudentForm()
    return render(request, 'admin/add_student.html', {'form': form})

Upvotes: 8

Views: 26469

Answers (2)

Aun Syed Shah
Aun Syed Shah

Reputation: 56

You can use Django messages framework to achieve this.

In Your views.py file first import messages

from django.contrib import messages

then do something like this

if request.method == 'POST':
        form = AddStudentForm(request.POST, request.FILES)
        if form.is_valid():
            student = form.save(commit=True)
            student.save()
            messages.success(request, 'student with name  {}  added.'.format(student.name))
            return redirect('admin:add_student')
        else:
            for error in form.errors:
            messages.error(request, sign_in_form.errors[error])
            return redirect(request.path)
else:
    form = AddStudentForm()
    return render(request, 'admin/add_student.html', {'form': form})

In your HTML File, access messages something like

        {% if message.tags == 'error' %}
            <!-- bootstrap alert -->
            <div class="alert alert-warning alert-dismissible fade show" role="alert">
                <strong>{{ message }}</strong>
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            </div>
        {% endif %}
        {% if message.tags == 'success' %}
            <!-- bootstrap alert -->
            <div class="alert alert-success alert-dismissible fade show" role="alert">
                <strong>{{ message }}</strong>
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            </div>
        {% endif %}
    {% endfor %}

Upvotes: 3

shourav
shourav

Reputation: 996

in your views.py pass the form with errors like this

if request.method == 'POST':
    form = AddStudentForm(request.POST, request.FILES)
    if form.is_valid():
        student = form.save(commit=True)

        student.save()

        messages.success(request, 'student with name  {}  added.'.format(student.name))
        return redirect('admin:add_student')

    return render(request, 'admin/add_student.html', {'form': form}) 
else:
    form = AddStudentForm()
    return render(request, 'admin/add_student.html', {'form': form})

That means you should remove the else part and in your template code

{% if form.errors %}
    <div class="alert alert-danger">
        {{ form.errors }}
    </div>
{% endif %}

Updated the answer to get proper answer when you load the view first time

Upvotes: 19

Related Questions