У меня есть модель с пользователем как 1 поле (внешний ключ) и еще одно поле skill_group. Мне нужно убедиться, что пользователь не добавляет дубликаты групп навыков, поэтому я добавил UniqueConstraint. Это работает из-за системных ошибок с IntegrityError в / skillgroup / create /
значение дубликата ключа нарушает ограничение уникальности «unique_skillgroup» - как мне перехватить это исключение и уведомить пользователя, если дубликат; в противном случае сохранить его?
Впервые в Django / Python / Postgres, и я подумал, что смогу справиться с этим, переопределив функцию save (), но нет доступа к пользователю, который является частью проверки, и я прочитал, что это не должно обрабатываться здесь. Есть ли попытка / сохранение улова / сообщения, которое я должен использовать? Я попробовал несколько вещей без удачи. Я видел подобные вопросы здесь, но они не помогли. Любая помощь приветствуется.
models.py
class SkillGroup(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
skill_group = models.CharField(max_length=35)
sequence = models.IntegerField(default=999)
class Meta:
constraints = [
models.UniqueConstraint(fields=['user', 'skill_group'], name='unique_skillgroup'),
]
def __str__(self):
return self.skill_group
def get_absolute_url(self):
return reverse('skillgroup-list')
views.py
class SkillGroupCreateView(LoginRequiredMixin, CreateView):
model = SkillGroup
fields = ['skill_group']
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.sequence = SkillGroup.objects.filter(user=self.request.user).order_by('sequence').last().sequence + 1
return super().form_valid(form)
skillgroup_form.html
{% extends "recruiter/baseskills.html" %}
{% load crispy_forms_tags %}
{% block content%}
<div class="content-section">
<form method="post">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Skill Group</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Add Skill Group</button>
</div>
</form>
</div>
{% endblock content%}
Я хочу либо поймать исключение и сохранить запись, если не дубликат, либо вывести на экран сообщение с надписью «Группа навыков уже существует» и оставить пользователя на странице создания. Кроме того, я могу удалить UniqueConstraint и обработать его с помощью кода, если это лучшее решение.