관리 페이지에서 M2M의 양쪽 편집
-
19-09-2019 - |
문제
먼저 다른 방법이있는 경우에 내가 달성하려는 것을 배치 할 것입니다!
Multi Select 인터페이스를 사용하여 M2M 관계의 양면을 M2M 관계 (바람직하게는 관리 페이지에서 일반 페이지에있을 수 있음)를 편집 할 수 있기를 원합니다.
문제는 분명히 (관계가 정의 된 위치)가 자동으로 잘 작동하기 때문에 반대 측면과 함께 제공됩니다.
나는 인라인이 나타나기 위해 조언 중 일부를 시도했지만 작동하지만 그다지 좋은 인터페이스는 아닙니다.
Django 메일 링리스트에서 얻은 조언은 Custom Modelform을 사용하는 것이 었습니다. 다중 선택 상자를 표시하는 한 멀리 떨어져 있지만 선택한 것으로 시작하지 않고 변경된 변경 사항을 저장하지 않기 때문에 어떤 것도 "연결"되지 않는 것 같습니다.
적절한 코드 스 니펫은 다음과 같습니다.
#models.py
class Tag(models.Model):
name = models.CharField(max_length=200)
class Project(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
tags = models.ManyToManyField(Tag, related_name='projects')
#admin.py
class TagForm(ModelForm):
fields = ('name', 'projects')
projects = ModelMultipleChoiceField(Project.objects.all(), widget=SelectMultiple())
class Meta:
model = Tag
class TagAdmin(admin.ModelAdmin):
fields = ('name', 'projects')
form = TagForm
위의 코드를 작동 시키거나 더 나은 방법을 제공함으로써 모든 도움이 감사하겠습니다!
데이비드
해결책
자동으로 아무것도 일어나지 않는 이유는 "프로젝트"필드가 태그 모델의 일부가 아니기 때문입니다. 그것은 당신이 모든 일을 직접해야한다는 것을 의미합니다. (tagform)과 같은 것 :
def __init__(self, *args, **kwargs):
super(TagForm, self).__init__(*args, **kwargs)
if 'instance' in kwargs:
self.fields['projects'].initial = self.instance.project_set.all()
def save(self, *args, **kwargs):
super(TagForm, self).save(*args, **kwargs)
self.instance.project_set.clear()
for project in self.cleaned_data['projects']:
self.instance.project_set.add(project)
코드는 테스트되지 않았으므로 작업을 수행하려면 트위를해야 할 수도 있습니다.
제휴하지 않습니다 StackOverflow