2009-11-09 4 views
7

먼저 다른 방법으로 갈 경우를 대비하여 내가 달성하고자하는 것을 정리해 보겠습니다!관리자 페이지에서 M2M의 양쪽 수정하기

다중 선택 인터페이스를 사용하여 M2M 관계의 양면을 편집 할 수 있습니다 (보통 페이지에있을 수 있지만 필요하면 관리 페이지에서 가능).

메인면 (관계가 정의 된 부분)이 자동으로 잘 작동하므로 문제는 명백히 반대면과 함께 나타납니다.

인라인을 표시하기 위해 여기에 조언을 시도했는데 작동하지만 아주 좋은 인터페이스는 아닙니다.

django 메일 목록에있는 조언은 사용자 정의 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 

어떤 도움이 많이 중 하나가 작동하려면 위의 코드를 얻거나 그것을 할 수있는 더 좋은 방법을 제공함으로써, 주시면 감사하겠습니다!

DavidM

+1

와우, 친절한 사람들, 11 분 2 투표! – DavidM

답변

2

아무것도가 자동으로 발생하지 않는 "프로젝트"필드는 태그 모델의 일부가 아닌 것입니다 이유. 그 말은 너 자신 모든 일을해야한다는 뜻이야. (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) 

참고.

+0

트릭을 고맙게 여긴 것처럼 보이지만 문제가 있습니다. '인스턴스'는 kwargs에 있지만 초기 설정은 아무 효과가없는 것으로 보입니다. 테스트하려면 self.fields [ 'name']을 설정해 보았습니다. initial = 'test'그리고 인터페이스에도 나타나지 않습니다. – DavidM

+0

나는 이것을 답으로 표시하고 그것에 대해 계속 비웃을 것이다. 나는 그것을 정렬하면 여기에 답변을 게시 할 것입니다. 감사! – DavidM