Valachio
Valachio

Reputation: 1135

Validation errors not showing up

So I'm stuck on why validation errors aren't showing for this particular form. They are showing up fine on all my other forms, but not this one.

I can empirically see the validation at work because when office_street_address is none, the form is not saving. But the form.non_field_error doesn't seem to have any errors.

forms

class PremiumAgentForm(forms.ModelForm):

    class Meta:
        model = Agent
        exclude = ['field1', 'field2', ...]

    def __init__(self, *args, **kwargs):
        super(PremiumAgentForm, self).__init__(*args, **kwargs)

        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form-control'

    def clean(self):
        cd = super(PremiumAgentForm, self).clean()
        a = cd.get('office_street_address')

        if a == None:
            raise forms.ValidationError("Error")

        return cd

html

<form class="row justify-content-center" enctype="multipart/form-data" method="post">
        {% csrf_token %}

        {% for error in form.non_field_errors %}
        <p style="color: red">{{ error }}</p>
        {% endfor %}

        {% if form.non_field_errors %}
        <p style="color: red">there are errors</p>
        {% else %}
        <p>no errors</p>  # This is always displayed.
        {% endif %}

        <div class="col-sm-4">
            {% for field in form %}
            <div class="form-group pb-3">
                {% for error in field.errors %}
                <p style="color: red">{{ error }}</p>
                {% endfor %}
                {{ field.label_tag }}
                {{ field }}
                {% if field.help_text %}
                <small class="form-text text-muted">{{ field.help_text|safe }}</small>
                {% endif %}
            </div>
            {% endfor %}
            <button class="button2"><span>Submit</span></button>
        </div>
    </form>

views.py

def edit_profile(request):
    if request.method == 'POST':
        form = PremiumAgentForm(request.POST, request.FILES, instance=agent)
        if form.is_valid():
            form.save()
        return HttpResponseRedirect(request.META['HTTP_REFERER'])
    else:
        agent = get_object_or_404(Agent, pk=request.user.agent.pk)
        form = PremiumAgentForm(instance=agent)
    return render(request, 'edit_profile.html', {'form': form})

Upvotes: 0

Views: 403

Answers (1)

neonua
neonua

Reputation: 172

In your case, you keep the form if it is valid, and after that you do a redirect, even if the form is not valid. This should help:

if not form.is_valid():
    return render(request, 'edit_profile.html', {'form': form}) 
form.save()

Upvotes: 1

Related Questions