분명히 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 필드를 추가하면 더 이상 작동하지 않습니다.
이것은 장고 버그와 같이 점점 더 냄새를 풍깁니다.
불행히도 유효성 검사 오류로 인해 ModelAdmin.save_formset()이 호출되지 않습니다. –