覆盖form.save()以不创建新记录,但每次执行时都会更新db表中的现有记录

时间:2015-07-17 15:08:33

标签: django django-views

当我在视图中保存表单时,我正在努力阻止在数据库表中创建新行。

我的视图中有以下代码

def checker(request):
  response_data=''
  if request.method == "POST":
    user_form1 = DocumentForm(request.POST, request.FILES) 
    if user_form1.is_valid(): 
        new_form = user_form1.save(commit=False)
        new_form.save()  # Image file gets uploaded in the server and new row gets created each time this gets executed
        user_form1.save_m2m()
        res=td_tab.objects.filter(id=request.session.get('proid')).update(profpicpath=new_form.profpicpath.url)
        response_data = 'Updated response'
else:
    form = DocumentForm() 
    response_data = 'Nothing to update!'
return HttpResponse(response_data, content_type="text/plain")

表格:

class DocumentForm(forms.ModelForm):
    profpicpath = forms.FileField()
    class Meta:
        model = td_tab
        fields = ('profpicpath',)
除了profpicpath之外,

模型还有几个字段。

问题是,在我看来,当执行new_form.save()时,它正在数据库表中创建新记录:(

我希望为特定的proid更新现有记录。 令人惊讶的是,下面的行在视图中不起作用..即使我使其工作,新行也会被创建,并且只有profpicpath字段在数据库表中填充最新条目:(

res=td_tab.objects.filter(id=request.session.get('proid')).update(profpicpath=new_form.profpicpath.url)

如何阻止在为查看器视图发出的每个请求中在td_tab表中创建新记录?

或者可能有一些技巧来覆盖表单的save()方法,这样它只是更新现有记录而不是为每个执行创建新记录?

1 个答案:

答案 0 :(得分:1)

您应该传递模型实例以更新到表单对象:

your_instance = Model.objects.get(some_data=some_data)
form = DocumentForm(request.POST or None, instance=your_instance)

if form.is_valid():
   ...
   ...
   form.save()