Django 表单插入时我希望它更新

0 投票
1 回答
4928 浏览
提问于 2025-04-15 19:59

我刚开始学习Django,但我发现我在另一个网站上几乎一模一样的代码可以正常工作。我可以在Django的命令行中更新记录,但在view.py中运行这个表单时,同样的代码却总是插入一个新记录。

  • 我在模型中有一个“DisciplineEvent”对象。我让Django自动创建“id”字段作为主键。我看到MySQL中已经创建了一个带有自动递增的“id”整数字段。
  • 表单DisciplineEventEntryForm是从“DisciplineEvent”模型对象创建的。
  • 为了编辑一条记录,表单会被填充,并且主键(pk)会放在一个名为“id”的隐藏字段中,这个字段似乎和POST数据一起提交。

所以view.py中相关的部分是这样的:

if request.method == 'POST':
    incidentId = request.POST['id']
    editedEvent = DisciplineEvent.objects.get(pk=int(incidentId))
    form = DisciplineEventEntryForm(request.POST, instance=editedEvent)
    form.save()
    variables = Context({
        'account': account,
        'date': request.POST['event_date'],
        'description': request.POST['incident_description'],
        'incident_id':incidentId,
         })
     template = get_template('disciplineform_confirm_entry.html')
     output = template.render(variables)
     response = HttpResponse(output)
     return response

我以为这样可以拉取到相关的记录,把新的表单数据保存进去,然后更新这条记录。结果却是创建了一条新记录,所有数据都被插入了,并且主键递增了。

1 个回答

9

你想做的事情有点不寻常,而且可能会造成一个安全隐患

不应该通过你在表单中填入的隐藏id来获取对象的实例。用户很容易就能修改这个id,从而让你的代码覆盖掉其他他们可能没有权限访问的模型实例。

标准的做法是根据网址来获取对象。

def view_function(request,id):
    object_to_edit = get_object_or_404(Model,id=id) #Or slug=slug
    form = ModelForm(data = request.POST or None, instance=object_to_edit)
    if form.is_valid():
        form.save()
        redirect()
    return render_to_response('template_name',{},RequestContext(request))

希望这能帮到你!

撰写回答