2009-08-31 6 views
0

J'ai donné des détails sur mon code: Je ne sais pas pourquoi ma table est vide (il semble qu'elle était vide après avoir appelé save_model, mais je ne suis pas sûre).Django: enregistrer une nouvelle valeur dans un ManyToManyField

class PostAdmin(admin.ModelAdmin): 
    def save_model(self, request, post, form, change): 
     post.save() 

     # Authors must be saved after saving post 
     print form.cleaned_data['authors'] # [] 
     print request.user # pg 
     authors = form.cleaned_data['authors'] or request.user 
     print authors # pg 
     post.authors.add(authors) 

     print post.authors.all() # [<User: pg>] 

     # But on a shell, table is empty. WTF ?! : 
     # select * from journal_post_authors; 
     # Empty set (0.00 sec) 
+0

Les vues admin django se produisent dans une transaction, qui sont annulées si une exception est levée. La page de résultats s'affiche-t-elle normalement? Une autre possibilité pourrait être une erreur que nous avons tous à faire: interrogez-vous la bonne base de données dans la session shell? La base de données est-elle accessible en écriture par le processus django? – vincent

Répondre

2

Vous devez enregistrer à nouveau le message, après le post.authors.add (auteurs).

+0

pas vous - je soupçonne que 'form.cleaned_data ['authors']' est une chaîne quand il devrait être un objet utilisateur – Jiaaro

+0

Je suis sûr que af est correct ici, post.authors ne seront pas enregistrés dans le base de données à moins que post.save() ne soit appelé (qui, à son tour, appellera save_m2m()). – tghw

+0

save_m2m est une méthode ModelForm, pas une méthode de modèle http://docs.djangoproject.com/fr/dev/topics/forms/modelforms/#the-save-method – vincent

0

Je ne sais pas quel type de champ vous utilisez, mais ne devrait-il pas y en avoir un là-dedans quelque part? (ou quelque chose de similaire)

author = form.cleaned_data['authors'] 
User.objects.get(id=author) 
+0

En supposant qu'il utilise une sorte de widget de sélection multiple à partir des formulaires, les valeurs qui reviennent dans form.cleaned_data ['authors'] devraient être les identifiants de l'utilisateur, il n'aurait donc pas besoin d'un autre appel à la base de données. Dans tous les cas, ses commentaires indiquent clairement que form.cleaned_data ['authors'] est vide, donc il ajoute l'utilisateur à la place de la requête (authors = form.cleaned_data ['authors'] ou request.user), donc c'est gentil d'un point discutable. – tghw

1

J'ai trouvé la solution. Je viens de changer la valeur dans clean_data et cela fonctionne:

if not form.cleaned_data['authors']: 
    form.cleaned_data['authors'] = [request.user] 

Merci pour votre aide. :)

Questions connexes