【问题标题】:django update object with formdjango 用表单更新对象
【发布时间】:2014-07-17 03:21:43
【问题描述】:

在 django 1.6 中,我有一个带有

的模型
class Person(models.Model):
    name = models.CharField(max_length=200)
    lastname = name = models.CharField(max_length=200)

还有一个表格

class EventPerson(ModelForm):

    class Meta:
        model = Event
        fields = ['name', 'lastname']

如果我用

创建一个对象
p = Person.object.create(name='John')

我有一本字典

d = {'lastname':'Smith'}

如何使用字典和表单更新对象?

【问题讨论】:

    标签: django django-forms django-1.6


    【解决方案1】:

    使用最少代码的最简单方法是使用基于类的UpdateView

    这里是 Django 文档的链接:

    https://docs.djangoproject.com/en/dev/ref/class-based-views/generic-editing/#django.views.generic.edit.UpdateView

    views.py 代码示例是:

    from django.views.generic.edit import UpdateView
    from myapp.models import Person
    
    class PersonUpdate(UpdateView):
        model = Person
        fields = ['name', 'lastname']
        template_name_suffix = '_update_form'
    

    然后只需将表单添加到您的模板。默认情况下,模板名称为person_update_form.html

    模板代码如下:

    <form action="" method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="Submit" />
    </form>
    

    这还将使用您尝试更新的 Person 对象中的任何初始表单数据自动填充表单。

    编辑:

    根据您想要的对象的字典更新对象:

    • 获取对象

      person = Person.object.get(name='John')

    • 更新一下

      # if this is the new lastname d = {'lastname':'Smith'}

      # then access the dict and update it person.lastname = d['lastname']

    • 保存对象

      person.save()

    如果您不使用模板,则无需使用表单。

    【讨论】:

    • 我在管理命令中使用表单,我不能使用模板
    • 是的,我知道像person.lastname = d['lastname'] 这样的更新,但我的问题更普遍,在问题中只需要更新一个字段,但实际上我有更多字段。我喜欢使用表单来创建对象,因为我可以使用 cleanclean_ 等方法。
    【解决方案2】:

    如果您的模型没有继承属性,您可以使用:

    p.__dict__.update(d)
    p.save()
    

    您也可以在表单的__init__ 中使用它

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 2021-03-05
      • 2014-01-30
      • 2013-04-22
      • 2020-12-10
      • 1970-01-01
      • 2011-06-08
      • 2022-10-14
      • 2019-06-07
      相关资源
      最近更新 更多