顯然Django的的ModelAdmin /的ModelForm不允許你使用save_m2m()如果通過表的中間的ManyToManyField。保存M2M「通過」內聯在Django管理
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的問題。
UPDATE:嗯,我做了一個測試應用程序像上面找出問題,看來,它的作品如預期,正確保存M2M中介對象保存爲MyModel對象之後...只要我讓Django在運行時自動創建MyModel.id字段python manage.py syncdb
- 一旦我添加了GUID標識字段,它就不再起作用。
這種氣味越來越像一個Django的bug。
不幸的是,由於驗證錯誤,ModelAdmin.save_formset()永遠不會被調用。 – 2011-05-04 20:32:22