ModelForm: проверять UniqueConstraint, когда одно из полей не включено в форму - PullRequest
0 голосов
/ 14 октября 2019

У меня есть модель под названием Note. Каждый Note принадлежит User. Note должен иметь code, который уникален среди всех Note из User, к которым он принадлежит, следовательно, UniqueConstraint. NoteForm не включает поле owner, поскольку, очевидно, я хочу, чтобы оно заполнялось автоматически (пользователь не должен иметь возможность выбирать это).

"""core/models.py"""

from django.db import models
from django.contrib.auth.models import User


class Note(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='note')
    code = models.CharField(max_length=60)
    ...


    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['code', 'owner'], name='code_unique_per_user')
        ]




"""core/forms.py"""

from django import forms
from core.models import Note

class NoteForm(forms.ModelForm):

    class Meta:
        model = Note
        fields = (
            'code',
            ...
        )




"""core/views.py"""

from core.models import Note
from core.forms import NoteForm

def create_note(request):
    note = Note(owner=request.user)

    if request.method == "POST":
        form = NoteForm(request.POST, instance=note)

        if form.is_valid():
            form.save()

            return redirect(reverse('core:manage_notes'))
    else:
        form = NoteForm(instance=note)

    args = {'form': form}
    return render(request, 'core/create_note.html', args)

Теперь при создании Note при использовании NoteForm, UniqueConstraint не проверяется во время проверки, потому что форма не включает в себя поле onwer.

Как лучше всего выполнить эту проверку UniqueConstraint? Включение поля owner и установка его как скрытого работает, но не кажется правильным, потому что пользователь может связываться с ним и изменять значение. Также, если нарушено UniqueConstraint, ошибка связана не с полем code, а с целой формой. Интересно, должен ли я сам добавить подтверждение, и если да, то где лучшее место?

...