2011-10-13 4 views
2

Django Book에 따라 책/저자/발행자가 포함 된 기본 Django 응용 프로그램을 만들었습니다. 기존 책을 수정하기위한 방법을 만들기 위해 ModelForm을 사용하려고 시도했지만 문제는 'authors'필드는 ManyToManyField이고 ModelForm에서 선택 사항을 선택하면 기존 선택 항목이 지워지고 새 항목을 저장하지 않습니다.ModelForm 및 ModelMultipleChoiceField를 사용하여 ManyToManyField에 저장

models.py

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField2(Author) 
    publisher = models.ForeignKey(Publisher) 
    publication_date = models.DateField() 

    def __unicode__(self): 
     return self.title 

class BookForm(ModelForm): 
    class Meta: 
     model = Book 

    authors = forms.ModelMultipleChoiceField(queryset=Author.objects.all(), required=False) 

views.py

def editBook(request, b=None): 
    instance = None 
    if b is not None: 
     instance = Book.objects.get(title=b) 
    if request.method == 'POST': 
     form = BookForm(request.POST, instance=instance) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/contact/thanks/') 
    else: 
     form = BookForm(instance=instance) 
    return render_to_response('book_form.html', {'form':form}) 

건배!

편집 나는 단지에 다음과 같은 권장 몇 가지 기사를 발견했다

authors = form.save(commit=False) 
authors.user = request.user 
authors.save() 
form.save_m2m() 

views.py하지만 여전히 운을 가지고 있지 것은 -이 어려울 수 없습니다!

답변

2

해결책이 ModelForm의 방법을 저장 오버라이드 (override)하는 것이었다 :

def save(self, commit=True): 
    authors =[] 
    for a in self.cleaned_data['authors']: 
     authors.append(Author.objects.get(first_name=t.first_name)) 

    b = super(BookForm, self).save(commit=commit) 

    for a in authors: 
     b.authors.add(a) 
    b.save() 
0

authors 필드를 무시하기 때문입니다. 어느 쪽이든 그것을하지 않고 장고가 일을하도록하거나 수동으로 처리하십시오.

+0

정확히 어떻게 수동으로 처리하나요? 미묘한 질문에 사과하지만 이것으로 잠시 고생했습니다! – jonseager

+0

@jonseager 왜 이것을 필요로합니까? 이'authors = ...'줄을 제거하면 모든 것이 제대로 작동합니다. – DrTyrsa

+0

나는 그것을 잠시 후에 제거했다 - 아직도 저장하지 않고있다. 나는 쉘에 cleaned_data를 출력 할 수 있고 작성자를 보여주기 때문에 형식을 올바르게 읽었지만 실제로는 저장하지 않습니다. 당신의 도움을 주셔서 감사합니다! – jonseager