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 и будет выведено сообщение об успехе. Я думаю, что лучший способ - это реализовать чистый метод для полей, которые должны быть уникальными. Смотрите документацию по валидации полей формы.