Django:Form.save()INSERT不起作用,只有UPDATE

时间:2011-08-28 05:11:56

标签: django forms insert

好的,所以我转到'employment_add'的视图,我在Django表单的字段中输入值,然后提交。

成功,它创建一个新的就业记录,页面以空表格重新加载。

当我输入值并第二次提交时,它会更新;即使我没有将一个实例传递给表单,它也是未绑定的。

我希望能够创建一份新的就业记录。

有什么建议吗?谢谢你的帮助。

--- --- UPDATE

继拉吉夫的回答之后:我不明白Django从哪里获得前一个对象的uuid。任何人都可以解释在RequestContext中存储这些信息的位置吗?表单或POST数据中没有uuid(pk)字段,我无法在RequestContext中的任何位置找到它。我也没有将一个实例传递给Form 情景......任何解释都会非常感激

--- --- UPDATE 在Employment_add视图中,问题似乎出现在就业的实例中。 请参阅代码

下面的pdb跟踪
===MODELS===

###User Model is provided by Django

import uuid
def make_uuid():
    return str(uuid.uuid4())

class __base__(models.Model):
    uuid = models.CharField(max_length=36, primary_key=True,
      default=make_uuid(), editable=False)
        #max_length must be 36. uuid4 generates a 36 character key

    class Meta:
        abstract = True

class Employment(__base__):
    user = models.ForeignKey( User, related_name='employment')
    ### employment related fields - no other PK or FK

===FORM===
class EmploymentForm(ModelForm):
class Meta:
    model = Employment
    exclude = ('user')
    widgets = {
    }

===VIEW===
def employment_add(request):
    context_instance = RequestContext(request)
    u = request.user
    if request.method == 'POST':
        message=""
        form = EmploymentForm(request.POST)
        if form.is_valid():
            f = form.save(commit=False)
            f.user = u
            f.save()
            message = "Position Added"
            form = EmploymentForm()
        return render_to_response("employment_add.html", {'form':form,    'message':message}, context_instance)
    else:
        em = Employment()
        #start pdb trace here
        form = EmploymentForm(instance=em)
    return render_to_response("employment_add.html", {'form': form},   context_instance)

===pdb trace===

(Pdb) em
<Employment: Employment object>
(Pdb) em.uuid
u'260015bc-c2eb-4cc1-9506-75e312027404'  
(Pdb) c

[29/Aug/2011 14:15:25] "GET /person/employment/add HTTP/1.1" 200 4425

[29/Aug/2011 14:15:33] "POST /person/employment/add HTTP/1.1" 302 0
<QueryDict: {u'month_start': [u''], u'year_start': [u''], u'year_end': [u''], u'employer': [u'66'], u'details': [u'6'], u'month_end': [u''], u'position': [u'66'], u'csrfmiddlewaretoken': [u'9e9c6b2ac43c370f993cb3f72682c7ea'], u'city_town': [u'']}>

[29/Aug/2011 14:15:33] "GET /person/view?i=1 HTTP/1.1" 200 9255
(Pdb) em
<Employment: Employment object>
(Pdb) em.uuid
u'260015bc-c2eb-4cc1-9506-75e312027404'
(Pdb) 

2 个答案:

答案 0 :(得分:3)

问题似乎是default=make_uuid()。这仅在模型类创建时运行make_uuid一次,并将一个生成的值(不是函数)作为字段的默认值传递。每次创建实例时,都会使用相同的默认值。

您应该将callable作为默认值传递,例如:default=make_uuid

答案 1 :(得分:0)

在代码的最后:

else:
    form = EmploymentForm()
return render_to_response("employment_add.html", {'form': form},   context_instance)

从对render_to_response的调用中删除context_instance。此上下文实例包含提交的表单数据,并在第二次预填充表单。