У меня есть модель, которая имеет ограничение уникальности для двух полей (каждый пользователь должен иметь разные имена профилей):
class Profile(Model):
user = ForeignKey(settings.AUTH_USER_MODEL, on_delete=CASCADE)
name = CharField(max_length=50)
description = TextField(blank=True)
class Meta:
constraints = [
models.UniqueConstraint(fields=['user', 'name'], name='profile_unique_user_name')
]
Когда пользователь добавляет новый профиль, я не хочу предоставлять ему доступ изменить пользователя, поэтому форма имеет только два поля:
class ProfileForm(ModelForm):
class Meta:
model = Profile
fields = [
'name',
'description',
]
В представлении я назначаю пользователя после проверки формы:
@login_required
def profile_add(request):
if request.method == 'POST':
form = ProfileForm(request.POST)
if form.is_valid():
form = form.save(commit=False)
form.user = request.user
form.save()
return redirect('home')
else:
form = ProfileForm()
return render(request, 'profile_add.html', {'form': form})
Однако проблема кажется быть, что проверка уникальности не происходит. Предположительно, потому что поле user
не в форме.
Как мне изменить свой код, чтобы любые ошибки уникальности возвращались к ошибкам формы?
Моя текущая идея - добавить Пользовательское поле формы и оставьте его вне шаблона, затем вручную добавьте значение в представление. Хотя это кажется немного хакерским. Будет ли это даже работать, и есть ли лучший способ?