2014-01-16 5 views
0

Я пытаюсь создать ModelForm, который будет обновлять таблицу с помощью внешних ключей. То, что я, кажется, работает, но я надеялся, что кто-то скажет мне, есть ли лучший способ сделать это или если есть проблема с тем, как я делаю это ниже.Django ModelForm с внешним ключом

Правильно ли использовать набор запросов в таблице Author and Genres? Мне кажется, что я должен использовать набор запросов в модели книги и связывать внешний ключ с этими таблицами.

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'] 

И пусть Джанго справиться с определением тех. , если вам нужно добавить ярлыки или виджеты, вы можете определить их в мета-класс:

class BookForm(ModelForm): 

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

Например.

+0

Спасибо! (Текст наполнителя) – user3184033

0

Я не совсем уверен, что вы спрашиваете здесь, или почему ты хотел бы задать запрос в Книге.

Вы фактически не изменили какой-либо из значений по умолчанию на любом из полей, так что нет никакой необходимости переопределять их: ваша форма может быть просто

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

и он будет работать точно так же.

Смежные вопросы