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

时间:2011-05-03 16:48:59

标签: python django many-to-many admin inline

显然Django的ModelAdmin / ModelForm不允许你使用save_m2m(),如果有一个ManyToManyField的中间直通表。

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)

如果我首先保存MyModel然后通过内联添加一个新的相关直通模型它工作正常,但如果我尝试设置内联同时还为新的MyModel添加数据,我得到Django管理员错误“请更正错误如下。“没有突出显示如下。

如何保存MyModel然后保存内联中间模型?很明显,Django可以在保存MyModel后保存直通模型 - 所以我只是想找到一个钩子。我尝试在调用instance.save()之后调用save_m2m()来覆盖表单的save()方法,但显然这对于​​带有直通表的M2M不起作用。

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

更新:好吧,我做了一个上面的测试应用来隔离问题,看起来它按预期工作,在保存MyModel对象后正确保存M2M中间对象...只要我让Django在运行python manage.py syncdb时自动创建MyModel.id字段 - 一旦我添加了GUID id字段,它就不再有用了。

这闻起来越来越像一个Django bug。

1 个答案:

答案 0 :(得分:0)

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