Невозможно вызвать ошибку проверки из ModelForm в браузере (DJANGO) - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь вызвать ошибку и показать ее в браузере, если пользователь вводит отправку ввода электронной почты, уже находящейся в базе данных. По некоторым причинам вместо сообщения об ошибке в базе данных ничего не сохраняется, но пользователь перенаправляется на страницу, на которую я настроен для перенаправления.

Я хочу иметь возможность остановить пользователя и вызвать ошибку, если в базе данных существует электронное письмо.

Модель:

class Foo(models.Model):
    full_name = models.CharField(max_length=50)
    email = models.EmailField(max_length=50, blank=False)
    phone_number = models.CharField(max_length=10, blank=False)

Формы.

from django import forms

from .models import Foo

class FooModelForm(ModelForm):
    class Meta:
        model = Foo
        fields = ['full_name', 
                'email',
                'phone_number']
        help_texts = {'full_name': ('Required'),
                    'email': ('Required'),
                    'phone_number': ('Required')}

    def clean_email(self):
        '''
        Check if exists in database.
        '''
        email = self.cleaned_data.get('email')
        try:
            match = Foo.objects.get(email=email)
        except Foo.DoesNotExist:
            return email

        # raise forms.ValidationError('This email is already in use.')

from django.shortcuts import render, redirect
from snippets.models import Foo
from snippets.forms import FooModelForm



def index(request):
    if request.method == 'POST':
        form = FooModelForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('snippets:form-sent')

    else:
        form = FooModelForm()

    context = {'form':form}
    return render(request, 'snippets/index.html', context)  

HTML

<form method="post" id="form">
    {% csrf_token %}
    {{ form|crispy }}
    <div class="text-center">
       <button type="submit" class="btn btn-primary">Submit</button>
    </div>
</form>

Я совершенно потерян здесь настолько просто, насколько это возможно.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 25 марта 2019

У вас простая проблема с отступами.Ваша строка return redirect... всегда вызывается на POST, даже если форма недействительна.Переместите его еще на один отступ, чтобы он находился внутри блока is_valid.

1 голос
/ 25 марта 2019

Ты почти там !! просто следуйте приведенному ниже фрагменту

from django import forms
from .models import Foo


class FooModelForm(ModelForm):
    class Meta:
        model = Foo
        fields = ['full_name',
                  'email',
                  'phone_number']
        help_texts = {'full_name': ('Required'),
                      'email': ('Required'),
                      'phone_number': ('Required')}

    <b>def clean_email(self):
        '''
        Check if exists in database.
        '''
        email = self.cleaned_data.get('email')
        if Foo.objects.filter(email=email).exists():
            return email
        else:
            raise forms.ValidationError('This email is already in use.')</b>


Почему я бы использовал exists() метод сверх try...except?

Это быстрее и эффективнее, чем try..except.
Ссылка : Что является более эффективным .objects.filter (). Exist () или get (), обернутый при попытке

...