Hi Mikhail, On Apr 24, 7:46 am, Mikhail Korobov <kmik...@googlemail.com> wrote: > The issue is not only with unique_together indeed. Please correct me if I'm > wrong, but it seems there is no way currently to use model validation with > fields dependent on each other when one of these fields is not POSTed > directly by user. Example: > > # models.py > class Ticket(models.Model): > created_by = models.ForeignKey(User, related_name='created_tickets') > responsible = models.ForeignKey(User, related_name='todo') > > def clean(): > # we don't want to allow tickets where created_by == responsible for > some reason > from django.core.exceptions import ValidationError > if self.created_by == self.responsible: > raise ValidationError('Responsible is incorrect.') > > # views.py > class TicketForm(forms.ModelForm): > class Meta: > model = Ticket > exclude = ['created_by'] > > @login_required > def add_ticket(request): > form = TicketForm(request.POST or None) > if form.is_valid(): > ticket = form.save(commit=False) > ticket.created_by = request.user > > # todo: handle ticket.full_clean() > > ticket.save() > return redirect('ticket_list') > return TemplateResponse(request, 'tickets/add.html', {'form': form}) > > Model.clean method is always called on form validation (unlike field > validators that are excluded if field is excluded from form). And we can't > write validator for 'responsible' field or for 'created_by' field (so that > it will be excluded from validation on form.is_valid) because this validator > won't have an access to other model fields. So the only option here seems to > move validation from model level to form level. > > Please consider this use case while rethinking model validation. The > proposed context manager seems to be a very good idea and I hope it will fix > this issue as well.
Sorry, I missed this somehow earlier. I agree with you that this is another example of why attempting to do partial model validation is simply broken. I think the context manager proposal (which I've posted in a new thread) does fix this case as well, and I'd be happy for your comments on it. Carl -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.