【问题标题】:ModelForm Instance vs InitialModelForm 实例与初始
【发布时间】:2021-05-27 10:05:18
【问题描述】:

我是 Django 的超级新手,所以对我来说太赤裸裸了。我正在尝试使用模型表单编写一个简单的 CRUD。在更新视图中,表单对象初始化采用参数 initial 和 instance,这让我感到困惑。来自 django 文档:

“与常规表单一样,可以通过在实例化表单时指定初始参数来指定表单的初始数据。以这种方式提供的初始值将覆盖来自表单字段的初始值和来自附加模型实例的值。”

这更令人困惑。我知道我的问题并不具体,但如果有人可以诚实地解释这一点,model 和 modelforms 之间的背景联系我将不胜感激。谢谢大家

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    这是来自 Django 文档的示例;

    from django.db import models
    from django.forms import ModelForm
    
    TITLE_CHOICES = [
        ('MR', 'Mr.'),
        ('MRS', 'Mrs.'),
        ('MS', 'Ms.'),
    ]
    
    class Author(models.Model):
        name = models.CharField(max_length=100)
        title = models.CharField(max_length=3, choices=TITLE_CHOICES)
        birth_date = models.DateField(blank=True, null=True)
    
        def __str__(self):
            return self.name
    
    
    class AuthorForm(ModelForm):
        class Meta:
            model = Author
            fields = ['name', 'title', 'birth_date']
    

    您的表单 -AuthorForm 包含 name 是字符串且不能超过 100 个字符的信息。因为它在您的模型中 -Authortitlebirth_date 相同。 title 不能超过 3 个字符,并且必须是 MRMRSMS 之一。

    如果您使用模型表单,则不必为表单字段指定类型和规则。模型表单可以从您的模型快速创建表单并根据您的模型进行验证。

    假设您有一个author 实例,其中nameJoe

    如果你打印author.name,它会返回Joe

    form = AuthorForm(initial={'name': 'Patrick'}, instance=author)

    如果您打印form['name'].value(),它将返回Patrick,而不是Joe。它忽略了authorname 值。您在表单中覆盖了它。如果您没有传递initial 参数,可能是Joe。

    【讨论】:

    • 我明白了。但是当我保存表单时,它仍然会更新作者实例,对吧?我想我不完全理解表单对象是什么。我知道我可以在 html 中打印它。但在这个例子中,如果我保存表单,作者实例是否会更新为 name = Patrick?
    猜你喜欢
    • 2010-12-14
    • 2019-08-11
    • 1970-01-01
    • 2013-08-17
    • 2018-01-11
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多