【问题标题】:Django ModelForm with foreign key带有外键的 Django ModelForm
【发布时间】:2014-01-16 14:38:54
【问题描述】:

我正在尝试创建一个 ModelForm 来更新具有外键的表。我所拥有的似乎有效,但我希望有人能告诉我是否有更好的方法可以做到这一点,或者我在下面的做法是否有问题。

AuthorGenres 表上使用查询集是否正确?感觉我应该在 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()

【问题讨论】:

    标签: python django


    【解决方案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', }
    

    例如。

    【讨论】:

    • 谢谢! (填充文字)
    【解决方案2】:

    我不确定你在这里问什么,或者你为什么想要 Book 上的查询集。

    您实际上并未更改任何字段的任何默认值,因此无需重新定义它们:您的表单可以很简单

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

    它的工作原理完全相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2017-08-17
      相关资源
      最近更新 更多