小编典典

具有外键的Django ModelForm

python

我正在尝试创建一个ModelForm用外键更新表的表。我似乎可以正常工作,但是我希望有人可以告诉我是否有更好的方法可以做到,或者我下面的操作方式是否有问题。

AuthorGenres表上使用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()

阅读 216

收藏
2021-01-20

共1个答案

小编典典

这段代码唯一的错误是您正在覆盖模型表单的默认行为。将其更改为如下所示:

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', }

例如。

2021-01-20