Django Форма отклоняет ввод, если определенный пользователь дважды использует одно и то же имя, и уведомляет пользователя

В Django у меня есть пользовательская форма, которая создает "группу электронной почты" внутри модала. Модель группы электронной почты содержит ряд атрибутов, включая уникальный ID для группы электронной почты, для пользователя и т.д.

Идея заключается в том, что конкретный пользователь не должен иметь возможности ввести одно и то же имя дважды - а если он это делает, то должен быть уведомлен.

Сейчас кажется, что форма отклоняет вводимые данные, которые дублируют имя_почты (они не добавляются в базу данных), но сообщение, которое она возвращает - New Email Added.

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

form.py

class EmailCreateForm(ModelForm):
class Meta:
    model = UserEmail
    fields = ['email_name']
    constraints = [
        models.UniqueConstraint(fields=['user_id', 'email_name'], name='unique_name')
    ]

def __init__(self, *args, **kwargs):
    super(EmailCreateForm, self).__init__(*args, **kwargs)  # Call to ModelForm constructor
    self.fields['email_name'].widget.attrs['rows'] = 1

views.py

def email(request):
if request.method == 'POST':
    form = EmailCreateForm(request.POST, instance=request.user)


    if form.is_valid():
        form.save()
        messages.success(request, f'New Email Added')
        return redirect('project-emails')
    else:
        messages.error(request, f'Email not Added')
        return redirect('project-emails')


else:
    form = EmailCreateForm()
return render(request, 'project/emails.html', {'form': form})

часть шаблона emails.html

{% if messages %}
{% for message in messages %}
    <div class="alert id = 'email-message'">
        {{ message|escape }}
    </div>
{% endfor %}
{% endif %}

Согласно документации Django:

В общем случае ограничения не проверяются во время full_clean(), и не вызывают ValidationErrors. Скорее вы получите ошибку целостности базы данных при сохранении(). Уникальные ограничения без условия (т.е. нечастичные уникальные ограничения) и выражения (т.е. нефункциональные уникальные ограничения) отличаются в этом отношении тем, что они используют существующую логику validate_unique() и, таким образом, обеспечивают двухэтапную валидацию. В дополнение к IntegrityError при сохранении(), ValidationError также возникает во время валидации модели, когда ограничение UniqueConstraint нарушается.

Таким образом, ваш form.is_valid() вернет true и будет выведено сообщение об успехе. Я думаю, что лучший способ - это реализовать чистый метод для полей, которые должны быть уникальными. Смотрите документацию по валидации полей формы.

Вернуться на верх