Bah, odio cuando me pasa esto, medio día buscando y justo después de
preguntarlo públicamente encuentro lo que buscaba...
Para todo el que tenga un problema similar, la solución está en usar
self.initial, que recibe un diccionario con los contenidos que había
antes si es que se está editando un objeto o un diccionario vacío si
se está creando uno nuevo.
¡Un saludo a todos!
Javi
class CategoryAdminForm(forms.ModelForm):
"""
Formulario para comprobar que no se intentan guardar dos
categorías en el mismo nivel/con mismo padre
"""
def clean_slug(self):
#comprobar si parent == None que self.slug no existe ya
#unique_together(("slug", "parent"),) no tiene en cuenta que
parent sea None :-(
data = self.cleaned_data['slug']
parent = getattr(self.data, 'parent', None) # tomamos el
atributo parent y lo ponemos a None si es vacío para poder compararlo
# el problema es que unique_together no funciona para parent =
None ¿no?
# pues entonces vamos a comprobar solo para esos casos :D
if parent == None:
categories = Category.objects.filter(slug=data, parent=parent)
if categories.exists() and not self.initial: # no estamos editando
raise forms.ValidationError(_(u'Ya existe una categoría con
esta Categoría superior y esta Ruta url'))
return data