2009-02-08 21 views
17

Tengo un modelo simple que se define como:forma Django falla la validación en un campo único

class Article(models.Model): 
    slug = models.SlugField(max_length=50, unique=True) 
    title = models.CharField(max_length=100, unique=False) 

y la forma:

class ArticleForm(ModelForm): 
    class Meta: 
     model = Article 

La validación aquí falla al intentar actualizar una existente fila:

if request.method == 'POST': 
    form = ArticleForm(request.POST) 

    if form.is_valid(): # POOF 
     form.save() 

Creación de una nueva entrada está muy bien, sin embargo, cuando trato de actualizar cualquiera de estos campos, la validación ya no pasa.

La propiedad "errores" no tenían nada, pero lo deja caer en el depurador y profundo de las entrañas de Django que vi esto:

babosa: "el artículo con esta Ninguno ya existe"

Así que parece is_valid() falla en una comprobación de valor único, pero todo lo que quiero hacer es actualizar la fila.

simplemente no puede hacer:

form.save(force_update=True) 

... porque la forma se producirá un error en la validación.

Esto parece algo muy simple, pero no puedo entenderlo.

Me postulo Django 1.0.2

Lo que estira la pata es BaseModelForm.validate_unique() que se llama en el formulario de inicialización.

+1

Por favor, editar y publicar el código del formulario. – Soviut

Respuesta

23

No creo que realmente estés actualizando un artículo existente, sino que creas uno nuevo, presumiblemente con más o menos el mismo contenido, especialmente el slug, y así obtendrás un error. Es un poco extraño que no obtienes mejores informes de errores, pero tampoco sé cómo se ve el resto de tu vista.

¿Qué pasa si intenta algo en esta línea (he incluido un poco más de una posible función de vista, cámbiela para que se ajuste a sus necesidades); En realidad no he probado mi código, así que estoy seguro de que he hecho al menos un error, pero al menos debe obtener la idea general:

def article_update(request, id): 
    article = get_objects_or_404(Article, pk=id) 

    if request.method == 'POST': 
     form = ArticleForm(request.POST, instance=article) 

     if form.is_valid(): 
     form.save() 

     return HttpResponseRedirect(to-some-suitable-url) 

    else: 
     form = ArticleForm(instance=article) 

    return render_to_response('article_update.html', { 'form': form }) 

La cosa es, como se ha señalado taurean, se debe crear una instancia su modelo con el objeto que desea actualizar; de lo contrario, obtendrá uno nuevo.

+0

Bien, hice una variación de esto. Entonces, una vez que asigno una instancia del artículo en el que trabajo, valida. De lo contrario, Django quiere crear un nuevo objeto. –

2

Todo lo que puedo adivinar es que está obteniendo un objeto para completar un formulario y tratando de guardarlo de nuevo.

Intente usar un ModelForm, e instálelo con el objeto deseado.

1

Parece que su SlugField está devolviendo None y como ya existe un slug nulo/en blanco en algún lugar de la base de datos, da un error 'ya existe'. Parece que tu campo de babosas no se está guardando correctamente.

+0

En realidad, encontré que el None era la etiqueta. Una vez que agregué label = 'slug', el mensaje se convirtió en {'slug': [u'Article with this slug ya existe. ']} –

4

También estaba buscando una forma de actualizar un registro existente, incluso intenté form.save(force_update=True) pero recibí errores ?? Finalmente, mediante la prueba & error, se logró actualizar el registro existente. Debajo de los códigos probados trabajando. Espero que esto ayude...

models.py de djangobook

class Author(models.Model): 
    first_name = models.CharField(max_length=30) 

    last_name = models.CharField(max_length=40) 

    email = models.EmailField(blank=True, verbose_name='e-mail') 

    objects = models.Manager() 

    sel_objects=AuthorManager() 

    def __unicode__(self): 
     return self.first_name+' '+ self.last_name 

class AuthorForm(ModelForm): 
    class Meta: 
     model = Author 


# views.py 
# add new record 

def authorcontact(request): 

    if request.method == 'POST': 

     form = AuthorForm(request.POST) 

     if form.is_valid(): 

      form.save() 

      return HttpResponseRedirect('/contact/created') 

    else: 

     form = AuthorForm() 

    return render_to_response('author_form.html', {'form': form}) 

actualización existente registro

def authorcontactupd(request,id): 

    if request.method == 'POST': 

     a=Author.objects.get(pk=int(id)) 

     form = AuthorForm(request.POST, instance=a) 

     if form.is_valid(): 

      form.save() 

      return HttpResponseRedirect('/contact/created') 

    else: 
     a=Author.objects.get(pk=int(id)) 

     form = AuthorForm(instance=a) 

    return render_to_response('author_form.html', {'form': form}) 
Cuestiones relacionadas