2011-05-03 9 views
3

Apparemment, ModelAdmin/ModelForm de Django ne vous permet pas d'utiliser save_m2m() s'il existe une table intermédiaire pour un ManyToManyField.Sauver M2M "Through" Inlines dans Django Admin

models.py:

from django.db import models 


def make_uuid(): 
    import uuid 
    return uuid.uuid4().hex 


class MyModel(models.Model): 
    id = models.CharField(default=make_uuid, max_length=32, primary_key=True) 
    title = models.CharField(max_length=32) 
    many = models.ManyToManyField("RelatedModel", through="RelatedToMyModel") 

    def save(self, *args, **kwargs): 
     if not self.id: 
     self.id = make_uuid() 
     super(GuidPk, self).save(*args, **kwargs) 


class RelatedModel(models.Model): 
    field = models.CharField(max_length=32) 


class RelatedToMyModel(models.Model): 
    my_model = models.ForeignKey(MyModel) 
    related_model = models.ForeignKey(RelatedModel) 
    additional_field = models.CharField(max_length=32) 

admin.py:

from django import forms 
from django.contrib import admin 

from .models import MyModel 


class RelatedToMyModelInline(admin.TabularInline): 
    model = MyModel.many.through 


class MyModelAdminForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 


class MyModelAdmin(admin.ModelAdmin): 
    form = MyModelAdminForm 
    inlines = (RelatedToMyModelInline,) 


admin.site.register(MyModel, MyModelAdmin) 

Si je sauve MyModel d'abord, puis ajouter un nouveau lié par modèle via la ligne, il fonctionne très bien, mais si je tente pour définir l'en ligne tout en ajoutant des données pour un nouveau MyModel, j'obtiens l'erreur Django Admin "Veuillez corriger l'erreur ci-dessous." avec rien mis en évidence ci-dessous. Comment puis-je avoir enregistrer MyModel, puis enregistrer les modèles intermédiaires en ligne après? Il est clair que Django peut enregistrer le modèle Through une fois qu'il a enregistré MyModel - donc je cherche juste un crochet dans ça. J'ai essayé de surcharger la méthode save() du formulaire en appelant save_m2m() après avoir appelé instance.save(), mais apparemment cela ne fonctionne pas pour les M2M avec une table through. J'utilise Django 1.2, mais c'est toujours un problème dans la version 1.3.

MISE À JOUR: Eh bien, je fait une application de test comme ci-dessus pour isoler le problème, et il semble que cela fonctionne comme prévu, sauver correctement l'objet intermédiaire M2M après avoir sauvé l'objet MyModel ... tant que je laisse Django crée automatiquement le champ MyModel.id lors de l'exécution python manage.py syncdb - une fois que j'ai ajouté le champ ID GUID, il ne fonctionne plus.

Cela sent de plus en plus comme un bug Django.

Répondre

0

Dans votre MyModelAdmin, vous pouvez essayer de remplacer la méthode save_formset. De cette façon, vous pouvez choisir l'ordre dans lequel vous enregistrez.

+0

Malheureusement, en raison de l'erreur de validation, ModelAdmin.save_formset() n'est jamais appelé. –

Questions connexes