【问题标题】:Django: using ModelForm to edit existing database entryDjango:使用 ModelForm 编辑现有数据库条目
【发布时间】:2011-11-13 01:45:19
【问题描述】:

我创建了一个 ModelForm 类,以便能够创建和编辑数据库条目。创建新条目效果很好,但是,我不知道如何使用 ModelForms 来编辑/更新现有条目。我可以使用以下方法用数据库实例实例化 ModelForm:

form  = MyModelForm(instance=MyModel.objects.get(pk=some_id))

但是,当我将其传递给模板并编辑字段然后尝试保存时,我会创建一个新的数据库条目而不是更新“some_id”?

编辑1: 这是我的看法

def editData(request):
if request.method == 'POST':
    form = MyModelForm(request.POST, request.FILES)

    if form.is_valid():
        editedEntry = form.save() # <-- creates new entry, instead of updating

【问题讨论】:

    标签: django django-templates django-forms


    【解决方案1】:

    请记住,当您在 POST 上实例化时,您仍然需要使用 instance 参数。

    instance = MyModel.objects.get(whatever)
    if request.method == "POST":
        form = MyModelForm(request.POST, instance=instance)
        ...
    
    else:
        form = MyModelForm(instance=instance)
    

    【讨论】:

    • 好吧,我没有那样做。那么我应该如何将我的主键“some_id”传递给 html 模板并再次返回给视图。我应该手动将其作为隐藏的表单字段还是有办法让 Django 处理它?
    • 没有必要这样做。只需使用上面显示的模式即可。
    • 但要做到这一点:instance = MyModel.objects.get(whatever),我需要用我用来创建初始 MyModelForm 的主键“some_id”替换“whatever”。我从哪里得到的?
    • 来自您最初获得它的同一个地方,即 URL。
    【解决方案2】:

    也可以,但稍短:

    instance = MyModel.objects.get(whatever)
    form = MyModelForm(request.POST or None, instance=instance)
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-15
      • 2014-12-01
      • 1970-01-01
      • 2014-07-29
      • 2016-08-08
      • 2021-12-01
      • 1970-01-01
      • 2019-12-02
      相关资源
      最近更新 更多