from django import forms from django.db import transaction class CommentForm(forms.Form): """ A fancy comment form. """ author = forms.CharField(label='Author', max_length=255) comment = forms.CharField(label='Comment', widget=forms.Textarea) parent = forms.IntegerField(label='Parent', required=False, widget=forms.HiddenInput) @transaction.commit_on_success def clean_parent(self): """ Parent field validation """ if self.root is None: self.add_method = self.tbmodel.add_root return parent_id = self.cleaned_data['parent'] if not parent_id: parent_id = self.root.id try: parent_obj = self.tbmodel.objects.get(id=parent_id) except self.tbmodel.DoesNotExist: raise forms.ValidationError('Invalid comment id: %d' % (parent_id,)) if parent_obj != self.root and not parent_obj.is_descendant_of(self.root): raise forms.ValidationError( 'Comment %d does not belong to convo %d (wrong page)' % (parent_id, self.root.id,)) self.add_method = parent_obj.add_child