如何从 Django 中的 ModelChoiceField 检索对象 ID

How to retrieve object id from ModelChoiceField in Django

这可能是非常简单的解决方案,但我自己想不出来。所以,基本上我有经典的数据库模型,包括书籍、作者和出版商。我唯一的问题是第一本书。要添加我正在使用 ModelChoiceField 选择 Publisher 的书。但是在尝试保存此表单后,我仍然收到 "Column 'publisher_id' cannot be null" 的错误。选择字段仅显示出版商名称,我不知道如何获取该出版商的 ID 以将其作为出版商 ID 添加到本书中。如果有任何帮助,我将不胜感激。

models.py:

    class Author(models.Model):
        firstName = models.CharField(max_length=20)
        lastName = models.CharField(max_length=30)

        def __unicode__(self):
            return u'%s %s' % (self.firstName, self.lastName)


    class Publisher(models.Model):
        name = models.CharField(max_length=100)
        year = models.DateField()

        def __unicode__(self):
            return self.name


    class Book(models.Model):
        title = models.CharField(max_length=80)
        publishYear = models.DateField()
        isbnNumber = models.DecimalField(max_digits=13, decimal_places=0)
        author = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)

forms.py:

class BookForm(forms.ModelForm):
    author = forms.ModelChoiceField(queryset = Author.objects.all())
    publisher = forms.ModelChoiceField(queryset=Publisher.objects.all())

    class Meta:
        model = Book
        fields = ['title', 'isbnNumber', 'publishYear']

view.py:

def book_add(request):
    if request.method == 'POST':
        form = BookForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/')
    else:
        form = BookForm()

    return render(request, 'book_add.html', {'form': form}, context_instance=RequestContext(request))

author是多对多,所以需要用ModelMultipleChoiceField.

但是我不知道您为什么首先要重新定义这些字段。 ModelChoiceField 已经是外键字段的默认值。删除这两个定义,并将 authorpublisher 添加到 fields 列表中。