Django表单在需要更新时插入

2024-10-01 11:26:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django新手,但我似乎有几乎相同的代码在另一个站点上工作。我可以在Django shell中更新记录,但是视图.py相同的代码坚持在我运行此窗体时插入一个新记录。在

  • 我在模型中有一个“纪律事件”对象。我让Django为主键创建“id”字段。我可以看到“id”int列是在MySQL中用auto_increment创建的
  • 形式DisciplineEventEntryForm是从“DisciplineEvent”模型对象创建的。在
  • 要编辑一条记录,需要填充条目表单,并将主键放在名为“id”的隐藏字段中,该字段似乎与POST数据一起提交。在

所以视图.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

我认为这将拉取有问题的记录,将新的表单数据保存到其中,并更新记录。相反,它创建一个包含所有数据和递增主键的新记录。在


Tags: 数据对象django代码py模型视图id
1条回答
网友
1楼 · 发布于 2024-10-01 11:26:44

您所要做的是非常规的,并且可能存在一个安全漏洞。在

您不应该从表单中填充的隐藏id键获取对象的实例。用户可以很容易地更改此实例,并让您的代码覆盖他们甚至没有权限访问的其他模型实例。在

标准的方法是根据url获取对象。在

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))

希望有帮助!在

相关问题 更多 >