2010-07-14 2 views
1

저는 장고에 웹 블로그 앱을 쓰고 있습니다. 저는 현재 Post와 PostMeta의 2 가지 모델을 가지고 있습니다. Post는 작성자, 제목, 내용 등과 같은 필드가있는 표준 포스트 스타일 모델입니다. 또한 두 번째 모델 PostMeta와 연관된 post_meta라는 하나의 다 대다 필드를 포함합니다. PostMeta는 meta_key 및 meta_value의 두 필드가있는 간단한 이름/값 모델입니다.Django : ModelForm의 save() 메소드에서 many-to-many 필드로 저장 하시겠습니까?

제가하려는 것은 관리 인터페이스에서 포스트 모델의 양식을보다 직관적으로 사용자 정의하는 것입니다. 특히 관리자를 위해 기본적으로 재 지정되는 직관적 인 선택 상자를 보는 대신 PostMeta 연결 만들기를 추상화하려고합니다. 사용자가 쉼표로 구분 된 게시물 태그 목록을 입력 할 수있는이 선택 상자 대신 텍스트 필드를 표시하고 싶습니다. 양식을 제출할 때 태그 필드의 입력을 개별 태그로 분할하고 각각을 PostMeta로 저장하려고합니다. 여기서 meta_key는 "TAG"로 설정되고 meta_value는 쉼표로 구분 된 문자열 중 하나가됩니다.

내가 가지고있는 문제는 올바르게 저장하지 못하는 것입니다. 필자는 구문에 문제가 있는지 잘 모르겠다. (필자는 파이썬에 처음으로 익숙하다.) 또는 놓친 것일 수도있는 다른 것들이 있는지 잘 모르겠다. 다음은 내 admin.py의 스 니펫입니다.

class PostAdminForm(forms.ModelForm): 
    tags = forms.CharField(max_length=200) 
    class Meta: 
     model = Post 
    def save(self, commit=True): 
     model = super(PostAdminForm, self).save(commit=False) 
     if commit: 
      model.save() 
      splitTags = self.cleaned_data['tags'].split(',') 
      for tag in splitTags: 
       pm = PostMeta(meta_key="TAG", meta_value=tag) 
       pm.save() 
       model.post_meta.add(pm) 
     return model 

class PostAdmin(admin.ModelAdmin): 
    model = Post 
    form = PostAdminForm 

admin.site.register(Post, PostAdmin) 

이 작업을 수행하는 방법에 대한 조언이나 제안 사항은 훌륭합니다. 아직 학습 중 : \

답변

2

코드에서 가장 즉각적인 문제는 save() 메서드가 장고 관리자에 의해 호출 될 때 commit 인수는 거의 항상 False입니다. 그러나 커밋 값을 무시하면 모델이 데이터베이스에 아직 생성되지 않았기 때문에 새로 생성 된 게시물에 대해 model.post_meta.add(pm)을 수행 할 수 없습니다 (따라서 Post ~ PostMeta m2m 테이블에서 참조 할 수 없기 때문에)).

my answer to a different post을 참조하십시오. 이는 귀하의 경우에도 적용 가능하다고 생각하며 유용한 코드를 꽤 많이 가지고 있습니다.

관련 문제