2011-05-03 55 views
3

顯然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。

回答

0

在你MyModelAdmin你可以嘗試重寫save_formset方法。這樣您可以選擇您保存的順序。

+0

不幸的是,由於驗證錯誤,ModelAdmin.save_formset()永遠不會被調用。 – 2011-05-04 20:32:22