Ok, thanks to Russell's help in IRC I managed to solve this. Thank you so
much!!
El lunes, 2 de junio de 2014 09:47:17 UTC+2, César García Tapia escribió:
>
> Hi, Russell, thanks for answering :-)
>
> Your answer helps me, but not completely. I can add the error with this:
>
> self._errors.append({'formula': self.error_class([msg])}) #
> self._errors in a BaseInlineFormSet is a list of dictionaries, not a
> dictionary, like you say.
>
> But I don't know how to reach the cleaned_data of the parent form. If I do
> this:
>
> del self.cleaned_data['formula']
>
> It says that the parent form doesn't have a 'cleaned_data' attribute.
>
> So I can make the InlineFormSet validation fail, but I can't show the
> error in my template.
>
> Any suggestion?
>
> Thank you!!
>
>
>
>
>
>
> El lunes, 2 de junio de 2014 02:26:56 UTC+2, Russell Keith-Magee escribió:
>>
>> Hi Cesar,
>>
>> It's all the documentation:
>>
>>
>> https://docs.djangoproject.com/en/dev/topics/forms/formsets/#custom-formset-validation
>>
>> You just have to raise a ValidationError(); Django will then add an error
>> that spans the entire formset.
>>
>> If you want to evaluate errors in clean(), but force the actual error to
>> appear against a specific field, that's possible too - you just need to
>> emulate what Django is doing behind the scenes. That means inserting the
>> error into the error dictionary, and removing the error value from
>> cleaned_data:
>>
>> self._errors['field name'] = self.error_class(['This field has a
>> problems'])
>> del cleaned_data['field_name']
>>
>> You might need to do this if you won't know if a specific value is valid
>> until you've checked all the individual values (e.g., A must be greater
>> than B - you can't check that until you know both A and B exist, which
>> won't be the case in the clean_A and clean_B methods)
>>
>> I hope that helps!
>>
>> Yours,
>> Russ Magee %-)
>>
>>
>>
>> On Sun, Jun 1, 2014 at 11:52 PM, César García Tapia <[email protected]>
>> wrote:
>>
>>> Hi. I already asked this question in StackOverflow, but I didn't get any
>>> useful answer. Let's try here :-)
>>>
>>> I have a BaseInlineFormSet, and I'd like to validate a field in the
>>> parent form based on the values on the fields of the children. As seen in
>>> the docs, the only method to make a custom validation is clean(), but I
>>> can't find a way to add errors to the parent form, only for the children.
>>>
>>> In the following code I build a formula. Each variable comes from a
>>> inner form, and if the global formula don't validate, I'd like to add an
>>> error to the parent's form field formula
>>>
>>> class CustomInlineFormSet(BaseInlineFormSet):
>>> def clean(self):
>>> formula = self.instance.formula
>>> variables = []
>>> for form in self.forms:
>>> if 'formula_variable' in form.cleaned_data:
>>> variables.append(form.cleaned_data['formula_variable'])
>>>
>>> valid, msg = validate_formula(formula, variables)
>>> if not valid:
>>> WHAT HERE???
>>>
>>> Thank you!!
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Django users" 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 http://groups.google.com/group/django-users.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/django-users/87ce32a8-782e-4248-8b8c-046b6eef0904%40googlegroups.com
>>>
>>> <https://groups.google.com/d/msgid/django-users/87ce32a8-782e-4248-8b8c-046b6eef0904%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
--
You received this message because you are subscribed to the Google Groups
"Django users" 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 http://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/d1150e33-20ca-4b83-863a-03730b24f961%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.