2014-01-16 100 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 

和它的工作完全一樣。