2014-01-16 104 views
0

我想创建一个ModelForm,它将用外键更新一个表。我似乎工作,但我希望有人能告诉我,如果有更好的方式来做到这一点,或者如果我在下面做的方式有问题。与外键的Django ModelForm

在Author和Genres表上使用queryset是否正确?感觉就像我应该在Book模型上使用查询集,并将外键与这些表关联起来。

models.py

class Author(models.Model): 
    name = models.CharField(max_length=200) 

class Genre(models.Model): 
    name = models.CharField(max_length=200) 

class Book(models.Model): 
    title = models.CharField(max_length=200) 
    author = models.ForeignKey('Author') 
    genre = models.ForeignKey('Genre') 

forms.py

class BookForm(ModelForm): 
    title = forms.CharField(max_length=200) 
    author = forms.ModelChoiceField(queryset=Author.objects.all()) 
    genre = forms.ModelChoiceField(queryset=Genre.objects.all()) 

class Meta: 
    model = Book 
    fields = ['title', 'author', 'genre'] 

views.py

def add_book(request): 
    if request.method == 'POST': 
     form = BookForm(request.POST) 
     if form.is_valid(): 
      form.save(commit=True) 
      return HttpResponseRedirect('/add/') 
    else: 
     form = BookForm() 

回答

4

这段代码唯一的问题是你重写了模型窗体的默认行为。 改变它的样子:

class BookForm(ModelForm): 

    class Meta: 
     model = Book 
     fields = ['title', 'author', 'genre'] 

而让Django的这些定义处理。 如果您需要添加标签或窗口小部件,你可以在Meta类中定义他们:

class BookForm(ModelForm): 

    class Meta: 
     model = Book 
     fields = ['title', 'author', 'genre'] 
     labels = {'title': 'Book title', } 

例如。

+0

谢谢! (填充文本) – user3184033

0

我真的不知道你问这里,或者你为什么会希望Book上的查询集。

您还没有真正改变任何有关字段的默认值,所以没有必要重新定义他们:你的形式可能是简单地

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

和它的工作完全一样。