2

情况:有一个包含一些数据的现有 mysql 数据库。对于这个例子,我只使用了两个字段;id主题id被定义为带有 *auto_increment* 选项的整数,而subject只是一个普通的 varchar。编码:

型号

class AList(models.Model):
    id=models.AutoField(primary_key=True, db_column='ID')
    subject=models.CharField(max_length=200, db_column='SUBJECT')
    class Meta:
        db_table = u'alist'

表格

class AForm(ModelForm):
    class Meta:
        model=AList

查看

def alistForm(request,a_id=None):
    if a_id:
        a=AList.objects.get(id=a_id)
        form=AForm(instance=a)
    else:
        form=AForm(request.POST or None)
    return render_to_response('aform.html',{'form':form},context_instance=RequestContext(request)

def alistPost(request):
    form=AForm(request.POST or None)
    if form.is_valid():
        form.save()

问题描述: 当表单向alistPost-function发送新数据时,form.save()按原样插入一条新记录。但是,当我编辑一个已经存在的记录时,它也会作为新记录插入......而不是像它应该做的那样更新。

尝试将 id 从AutoField更改为IntegerField会改变行为:修改记录会使form.save()修改现有记录,而尝试插入新记录则失败,因为它没有 id。

问题: 我是否必须手动从数据库中获取一个新的 ID 值并强制 Django 将它用于这条新记录,或者有没有办法让 Django 自动确定它是否应该使用 INSERT 或 UPDATE?

4

3 回答 3

4

龙骑在正确的轨道上,但你的评论是有道理的。一个更好的模式是这样的:

if a_id:
    a = AList.objects.get(id=a_id)
else:
    a = AList()
if request.POST:
    form = AForm(request.POST, instance=a)
    ...
else:
    form = AForm(instance=a)
于 2011-10-19T12:44:10.030 回答
1

This is what I did:

def someView(request,id=None):
   instance = form = None

   ...
      ...
   elif request.method == 'POST':

        if id != None:
            instance = SomeClass.objects.get(id=id)
            form = AForm(request.POST,instance=instance)
        else:
            form = AForm(request.POST) 

        if form.is_valid():

           instance = form.save()
           if not id:
               return redirect('edit',id=instance.id)
        else
            ...
        ...

urls:

url(r'^addedit/$', 'som.views.someView', name='edit'),
url(r'^addedit/(?P<id>.*)/$', 'som.views.someView', name='edit'),

so after the object is created at /addedit/, user is redirected to /addedit/1234/

于 2011-12-19T20:14:58.137 回答
0

问题是您在 instance向表单提供参数的单独函数中执行 POST。

尝试像这样将函数合并为一个:

def alistForm(request, pk)
    alist = get_object_or_404(AList, pk=pk)
    form = AFrom(request.POST or None, instance=alist)
    if request.method == 'POST':
        if form.is_valid():
            form.save()
    ...
于 2011-10-19T11:31:15.327 回答