I will best explain what I mean with an example.
Lets say we have a simple model called Book.
class Book(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=255)
class Meta:
unique_together = ('user', 'name')
so `Books` are linked to users, and we have added an unique constrain
because we don't want a user to have the same book twice.
Now lets say we want to allow users to create/update books, when we do this
we would only need their book.name, we already knew who they are in the
system.
So a simple ModelForm would look like this:
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ('name',)
Now since i've omitted the `user` field and I can't have a book w/o a user,
its my responsibility to populate it. Thus when I create new form i will
always a pass an instance with a user.
But before we do this, lets manually create 1 book for this user.
user = User.objects.get(pk=1)
book1 = Book.objects.create(user=user, name='Harry Potter')
#now lets build our form
book2 = Book(user=user)
form = BookForm(data={'name': 'Harry Potter'}, instance=book2)
if form.is_valid(): #yes the form will be valid
book2 = form.save() #IntegrityError will be raised with UNIQUE
constraint failed
Now this happens because `ModelForm.validate_unique
<https://github.com/django/django/blob/1.8.18/django/forms/models.py#L434>`
collects a set of fields to pass as an exclude fields into
`instance.validate_unique`.
Please, can someone explain me why is this done in such a manner, and what
will be the correct way approach this problem.
>From my point of view when I define a ModelForm I imagine that I have to
only explain what the user needs to see when the form gets rendered.
But when the instance is being validated, I would always want to validate
this instance as a whole (with the fields that I've omitted).
--
You received this message because you are subscribed to the Google Groups
"Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-developers/e5e49072-9d33-4faf-99f7-f7339437c73a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.