2010-07-14 10 views
1

J'écris une application webblog dans Django. J'ai actuellement 2 modèles Post et PostMeta. Post est un modèle de style de poste standard avec des champs tels que l'auteur, le titre, le contenu, etc. Il contient également un seul champ many-to-many appelé post_meta qui est associé à mon deuxième modèle PostMeta. PostMeta est un modèle de nom/valeur simple avec deux champs, meta_key et meta_value. Ce que j'essaie de faire est de personnaliser le formulaire du modèle Post dans l'interface d'administration pour être plus intuitif. Plus précisément, je veux abstraire la création d'associations PostMeta plutôt que de voir la boîte de sélection non intuitive qui est redéfinie par défaut pour l'administrateur. Je veux à la place afficher un champ de texte à la place de cette boîte de sélection où l'utilisateur peut entrer une liste d'étiquettes séparées par des virgules associées à la publication. Lorsque le formulaire est soumis, je veux diviser l'entrée du champ d'étiquette en tags individuels et enregistrer chacun comme un PostMeta où meta_key sera mis à "TAG" et meta_value sera l'une des chaînes séparées par des virgules.Django: Enregistrer dans un champ many-to-many dans la méthode save() d'un ModelForm?

Le problème que je rencontre est que je n'arrive pas à l'enregistrer correctement. Je ne suis pas sûr s'il y a un problème avec ma syntaxe (je suis relativement nouveau à python) ou s'il y a autre chose que j'ai besoin de faire que j'ai peut-être manqué. Voici un extrait de mon admin.py:

class PostAdminForm(forms.ModelForm): 
    tags = forms.CharField(max_length=200) 
    class Meta: 
     model = Post 
    def save(self, commit=True): 
     model = super(PostAdminForm, self).save(commit=False) 
     if commit: 
      model.save() 
      splitTags = self.cleaned_data['tags'].split(',') 
      for tag in splitTags: 
       pm = PostMeta(meta_key="TAG", meta_value=tag) 
       pm.save() 
       model.post_meta.add(pm) 
     return model 

class PostAdmin(admin.ModelAdmin): 
    model = Post 
    form = PostAdminForm 

admin.site.register(Post, PostAdmin) 

Des conseils ou des suggestions sur la façon de faire ce travail serait génial. Apprendre encore: \

Répondre

2

Le problème le plus immédiat dans votre code est que lorsque la méthode save() est appelée par l'administrateur Django, l'argument commit est presque toujours False. Cependant, si vous ignorez simplement la valeur de commit, vous ne pourrez pas faire model.post_meta.add(pm) pour les Posts nouvellement créés, puisque le modèle n'aura pas encore été créé dans la base de données (et donc ne peut pas être référencé dans la table m2m Post à PostMeta)).

Voir my answer to a different post, ce qui je pense est également applicable dans votre cas, et a un peu de code que vous pouvez trouver utile.

Questions connexes