基于视图中的现有唯一字段更新字段

时间:2012-08-13 19:39:59

标签: django unique-key modelform

我一直在讨论这个问题几个小时,我觉得这个问题很糟糕。该视图应该执行两个操作。第一步和工作操作是使用提交的表单数据创建对象。第二个操作是根据唯一字段'bar_code'更新'status'字段。在最初保存之后,然后更新我得到的错误是由唯一属性“%s已经存在此%s已经存在。”,这是预期的。我真的很想让视图执行这两个操作。

def check_in_part_two(request):
    errlst=[]
    c={}
    c.update(csrf(request))
    if request.method == 'POST':
        form = PartForm(request.POST)
        if form.is_valid():
            try:
                # Test if the part row exists based on bar_code
                instance = Part.objects.get(bar_code=request.POST['bar_code'])
            except Part.DoesNotExist:
                # Clean the sn and create new row
                form.cleaned_data['serial_number']
                form.save()
                return http.HttpResponseRedirect('/current_count/')
            else:
                edit = PartForm(request.POST, instance=instance, fields=['status'])
                if edit.is_valid():
                    edit.cleaned_data['bar_code']
                    edit.save()
                    return http.HttpResponseRedirect('/current_count/')

    else:
        form = PartForm(initial={'status':3L, 'serial_number':'placeholder'})
    return render(request,'add_part.html',{
                                           'title':'Add Item',
                                           'form': form,
                                           })

1 个答案:

答案 0 :(得分:3)

首先,我不知道您使用form.cleaned_data['serial_number']edit.cleaned_data['bar_code']行做了什么。这些是dict中的键,而不是方法,因此只需将它们单独放在一行就行无效。

其次,你这太复杂了。以下代码在功能上是等效的,可能更具功能性:

def check_in_part_two(request):
    if request.method == 'POST':
        try:
            part = Part.objects.get(bar_code=request.POST.get('bar_code'))
        except Part.DoesNotExist:
            form = PartForm(request.POST)
        else:
            form = PartForm(request.POST, instance=part)

        if form.is_valid():
            form.save()
            return http.HttpResponseRedirect('/current_count/')

    else:
        form = PartForm(initial={'status':3L, 'serial_number':'placeholder'})

    return render(request, 'add_part.html', {
        'title':'Add Item',
        'form': form,
    })