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.
Malheureusement, en raison de l'erreur de validation, ModelAdmin.save_formset() n'est jamais appelé. –