在Django Admin中保存M2M“直通”内联

Jou*_*sey 5 python django many-to-many inline admin

显然,如果存在ManyToManyField的中间通过表,则Django的ModelAdmin / ModelForm不允许您使用save_m2m()。

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

如果我先保存MyModel,然后通过内联添加新的贯穿模型,则可以正常工作,但是,如果我尝试设置内联,同时还为新的MyModel添加数据,则会收到Django Admin错误“请更正以下错误。 ” 下面没有突出显示的内容。

如何保存MyModel,然后再保存内联中介模型?显然,一旦Django保存MyModel,就可以保存直通模型-因此,我只是在寻找一个钩子。我尝试在调用instance.save()之后通过调用save_m2m()来覆盖表单的save()方法,但是显然,这对于带有穿透表的M2M无效。

我正在使用Django 1.2,但这在1.3中仍然是一个问题。

更新:嗯,我制作了一个如上所述的测试应用程序来隔离问题,并且看起来它可以按预期运行,只要保存了MyModel对象,就可以正确保存M2M中介对象……只要我让Django自动创建MyModel。运行时使用id字段python manage.py syncdb-添加GUID id字段后,它将不再起作用。

这闻起来越来越像Django错误。

小智 0

在 MyModelAdmin 中,您可以尝试覆盖 save_formset 方法。这样您就可以选择保存的顺序。