Python Django表单在需要更新时插入

Python Django表单在需要更新时插入,python,django,Python,Django,我是Django的新手,但我似乎在另一个网站上有几乎相同的代码。我可以在Django shell中更新一条记录,但在view.py中,同样的代码坚持在我运行此表单时插入一条新记录 我在模型中有一个纪律事件对象。我让Django为主键创建id字段。我可以看到id int列是用MySQL中的auto_increment创建的 表单StricteEventEntryForm是从StricteEvent模型对象创建的。 要编辑记录,将填充输入表单,并将pk放入名为id的隐藏字段中,该字段似乎与POST数

我是Django的新手,但我似乎在另一个网站上有几乎相同的代码。我可以在Django shell中更新一条记录,但在view.py中,同样的代码坚持在我运行此表单时插入一条新记录

我在模型中有一个纪律事件对象。我让Django为主键创建id字段。我可以看到id int列是用MySQL中的auto_increment创建的 表单StricteEventEntryForm是从StricteEvent模型对象创建的。 要编辑记录,将填充输入表单,并将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

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

您试图做的是非常规的,并且可能存在安全漏洞

您不应该从表单中填充的隐藏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))

希望有帮助

你能包括你的表单定义吗?也许还有模板代码。将“id”作为POST成员可能不是一个好主意。我现在很困惑,但是你的代码有点不合常规,所以很难猜测问题出在哪里。我只会在表单有效的情况下保存表单。。。您确定StricteEvent.objects.getpk=intincidentId返回一个对象吗?可能有些东西被破坏了,EditeEvent不包含任何对象。使用GET数据的一部分比使用POST数据的一部分更安全吗?这两个都完全可以由用户修改。凯洛坦:你把他和我都搞错了P他既不是通过GET传递参数,也不是我建议他通过POST传递参数。如果你同时阅读问题和答案,也许会有所帮助!基洛坦:为了扩展,他已经发布了数据;但他仅使用发布的id修改db中的内容。这就是风险。@Becominguru:但你的代码并没有解决这个问题。这仍然是不安全的。您的评论是对的。@Becominguru:您已经清楚地说了基于url获取对象。URL是GET请求的一部分,对于用户来说,修改它就像修改表单隐藏的POST字段一样容易。重要的是如何确定“id”值以及对其进行的检查,而您在本答案中没有提到这一点。