Django ModelForm con clave externa

Estoy intentando crear un ModelForm que actualizará una tabla con claves externas. Lo que tengo parece funcionar, pero esperaba que alguien me dijera si hay una mejor manera de hacerlo o si hay un problema con la forma en que lo hago a continuación.

¿Es correcto usar el queryset en la tabla de Autor y Géneros? Parece que debería estar utilizando un queryset en el modelo de Libro y relacionar la clave externa con esas tablas.

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

vistas.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() 

Lo único que está mal con este código es que está anulando el comportamiento predeterminado de su formulario modelo. Cambiarlo para que se vea como:

 class BookForm(ModelForm): class Meta: model = Book fields = ['title', 'author', 'genre'] 

Y dejemos que django maneje con la definición de esos. Si necesita agregar tags o widgets, puede definirlos en la clase Meta:

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

Por ejemplo.

No estoy realmente seguro de lo que está preguntando aquí, o por qué querría una consulta en el Libro.

En realidad, no ha cambiado ninguno de los valores predeterminados en ninguno de los campos, por lo que no hay necesidad de redefinirlos: su formulario podría ser simplemente

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

Y funcionaría exactamente igual.