使用ModelForm覆盖ModelForm字段值集(instance = some_instance)

时间:2012-11-05 20:37:00

标签: django django-models django-forms

我有以下型号 -

class Book(Model):
 title = CharField(max_length=100)
 author = ForeignKey('Author')

class Author(models.Model):
 name = CharField(max_length=100)

标准ModelFormBook

在表单中,authorModelChoiceField,并呈现为<select>。我希望它是文本字段,您可以在其中输入作者姓名 - Author.name

如果已有具有该名称的作者,则保存的模型在其外键中使用该名称,否则将创建具有该名称的作者(并在其外键中使用) - 效果为Author.get_or_create(name=posted_name_value)

我发现最简单的方法是将字段覆盖为CharField,就像这样 -

class BookForm(ModelForm):

 author = CharField()

 class Meta:
  model = Book

尽管如此,我可以添加自定义clean逻辑来执行我想要的操作,但在使用BookForm(instance=some_book_object)时,我无法对预先填充的值执行相同操作 - CharField获取设置为Author的{​​{1}},而不是其名称。

我试过这样做,但我似乎无法弄清楚如何。我试图在pk中覆盖一些内容但无济于事。

BookForm.__init__instance一起使用时,如何覆盖字段的值集?

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式覆盖字段内容:

form = BookForm(instance=instance, initial={'name': instance.author.name})

答案 1 :(得分:0)

我将author添加到ModelForm元的exclude,然后有一个名为author_name的表单字段,使用initial填充,并保存到模型中view的form_valid方法(假设您使用的是通用表单视图类)。