Как проверить ограничение уникальности нескольких полей для поля, которое не находится в форме? - PullRequest
0 голосов
/ 21 марта 2020

У меня есть модель, которая имеет ограничение уникальности для двух полей (каждый пользователь должен иметь разные имена профилей):

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 не в форме.

Как мне изменить свой код, чтобы любые ошибки уникальности возвращались к ошибкам формы?

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

...