2011-05-03 1 views
3

분명히 Django의 ModelAdmin/ModelForm에서는 ManyToManyField에 대한 중간 통과 테이블이있는 경우 save_m2m()을 사용할 수 없습니다.장고 관리에서 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) 

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에 대한 데이터를 추가하는 동안 인라인을 설정하려면 장고 관리자 오류 "아래 오류를 수정하십시오."가 표시됩니다. 아래에 아무것도 강조 표시하지 않았습니다.

어떻게하면 MyModel을 저장 한 다음 인라인 중간 모델을 저장할 수 있습니까? 분명한 것은 Django가 MyModel을 저장하면 통과 모델을 저장할 수 있음을 알 수 있습니다. 나는 instance.save()를 호출 한 후 save_m2m()을 호출하여 폼의 save() 메서드를 재정의하려고 시도했지만 분명히 관통 테이블이있는 M2M에서는 작동하지 않습니다.

저는 장고 1.2를 사용하고 있습니다. 그러나 이것은 여전히 ​​1.3의 문제입니다.

업데이트 : 글쎄, 난 문제를 격리하기 위해 테스트 애플 리케이션 위와 같이했고, 그것을 올바르게 MyModel 객체를 저장 한 후 M2M 중간 오브젝트를 저장, 예상대로만큼 내가하자로 ... 작동 표시 Django는 실행할 때 MyModel.id 필드를 자동으로 만듭니다. python manage.py syncdb - GUID id 필드를 추가하면 더 이상 작동하지 않습니다.

이것은 장고 버그와 같이 점점 더 냄새를 풍깁니다.

답변

0

MyModelAdmin에서 save_formset 메서드를 재정의하려고 시도 할 수 있습니다. 이렇게하면 저장 순서를 선택할 수 있습니다.

+0

불행히도 유효성 검사 오류로 인해 ModelAdmin.save_formset()이 호출되지 않습니다. –