2011-10-13 40 views
2

我已经创建了一个基本的Django应用程序,该应用程序包含根据Django书籍的书籍/作者/发布者 - 尝试使用ModelForm创建修改现有书籍的方法 - 问题在于'作者'字段是一个ManyToManyField,当我在ModelForm上选择一个选项时,它只是擦除现有的选择并且不保存新的选择?使用ModelForm和ModelMultipleChoiceField保存到ManyToManyFields

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}) 

干杯!

编辑 我刚刚发现了几个文章,鼓励在以下views.py

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

但仍然没有任何运气 - 不能这么难!

回答

2

的解决办法是覆盖在的ModelForm保存方法:

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字段。要么不这样做,让Django做它的工作,或手动处理它。

+0

究竟如何手动处理呢?对于nub问题的歉意,但一直在努力争取一段时间! – jonseager

+0

@jonseager你为什么需要这个?只要删除这个'authors = ...'行,一切都会按你的意愿工作。 – DrTyrsa

+0

我把它删除了一段时间 - 它仍然没有保存。表单被正确读取,因为我可以输出的清洁数据到shell,它显示作者 - 但仍然不实际保存?谢谢你的帮助! – jonseager