문제

먼저 다른 방법이있는 경우에 내가 달성하려는 것을 배치 할 것입니다!

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)

코드는 테스트되지 않았으므로 작업을 수행하려면 트위를해야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top