2009-02-08 5 views
17

J'ai un modèle simple qui est défini comme:forme Django validation échoue sur un champ unique

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

et la forme:

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

La validation échoue ici lorsque je tente de mettre à jour une existante ligne:

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

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

Création d'une nouvelle entrée est bien, cependant, lorsque je tente de mettre à jour l'un de ces domaines, la validation ne passe.

La propriété « erreurs » rien eu, mais je tombé dans le débogueur et profondément dans les entrailles de Django, j'ai vu ceci:

limaces: « Article ce Aucun existe déjà »

Il ressemble is_valid() échoue sur une vérification de valeur unique, mais tout ce que je veux faire est mettre à jour la ligne.

Je ne peux pas le faire:

form.save(force_update=True) 

... parce que la forme échouera à la validation. Cela ressemble à quelque chose de très simple, mais je n'arrive pas à le comprendre.

Je courais Django 1.0.2

Qu'est-ce que croasse est BaseModelForm.validate_unique() qui est appelée à l'initialisation du formulaire.

+1

S'il vous plaît modifier et envoyer votre code de formulaire. – Soviut

Répondre

23

Je ne pense pas que vous êtes en train de mettre à jour un article existant, mais en créer un nouveau, probablement avec plus ou moins le même contenu, en particulier le slug, et donc vous obtiendrez une erreur. C'est un peu étrange que vous n'obtiendrez pas de meilleurs rapports d'erreurs, mais je ne sais pas non plus à quoi ressemble le reste de votre vue.

Et si vous essayiez quelque chose dans ce sens (j'ai inclus un peu plus d'une fonction de vue possible, modifiez-la selon vos besoins); Je ne l'ai pas fait tester mon code, donc je suis sûr que je l'ai fait au moins une erreur, mais vous devriez au moins avoir l'idée générale:

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 chose est, comme taurean note, vous devez instancier votre modèle avec l'objet que vous souhaitez mettre à jour, sinon vous en obtiendrez un nouveau.

+0

A droite, j'ai fait une variation de ceci. Donc une fois que j'attribue une instance de l'article sur lequel je travaille, cela valide. Sinon, Django veut créer un nouvel objet. –

2

Tout ce que je peux deviner, c'est que vous obtenez un objet pour remplir un formulaire, et essayer de le sauvegarder à nouveau. Essayez l'utilisation d'un ModelForm et analysez-le avec l'objet désiré.

1

Il semble que votre SlugField renvoie None et qu'un slug vide/vide existe déjà quelque part dans la base de données, ce qui donne une erreur 'exists exists'. Il semble que votre champ de limace ne sauve pas correctement du tout.

+0

En fait, j'ai trouvé que le None était l'étiquette. Une fois que j'ai ajouté label = 'slug', le message est devenu {'slug': [u'Article avec ce slug existe déjà. ']} –

4

Je cherchais aussi un moyen de mettre à jour un enregistrement existant, même essayé form.save(force_update=True) mais a reçu des erreurs ?? Enfin par l'essai & erreur gérée pour mettre à jour l'enregistrement existant. Ci-dessous les codes testés en fonctionnement. J'espère que cela t'aides...

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}) 

mise à jour d'enregistrement existant

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})