Django ModelForm创建新实例而不是更新现有数据库条目

时间:2014-10-06 18:18:24

标签: python django

我尝试创建一个与单个用户相关的Tool对象一起使用的表单。

class Tool(models.Model):
    owner = models.ForeignKey(BaseUser)
    tool_type = models.CharField(('tool_type'), max_length=40, blank=True)
    description = models.CharField(('description'), max_length=100, blank=True)
    available = models.BooleanField()

此工具由此表格更新

class ToolForm(forms.ModelForm):
    tool_type = forms.CharField(max_length=40, label="Tool Type: ")
    description = forms.CharField(max_length=100, label="Description: ")
    available = forms.BooleanField(required = False)
    owner = forms.ModelChoiceField(queryset = BaseUser.objects.all(),
                                   widget=forms.HiddenInput())
    class Meta:
        model = Tool

该工具由此视图制作

@login_required
def tool_register(request):
    if request.method == 'POST':
        frm = ToolForm(request.POST)
        print(request.user)
        if frm.is_valid():
            frm.save()
            return render_to_response('tools/tool_register_success.html')
    else:
        frm = ToolForm(initial = {'owner':request.user})

    args = {}
    args.update(csrf(request))

    args['form'] = frm
    args['activeuser'] = request.user

    return render_to_response('tools/tool_register.html', args)

这就是问题所在。我是用这个视图更新工具的。

@login_required
def tool_edit(request, tool_id):
    curr_tool = Tool.objects.get(pk = tool_id)
    if request.method == 'POST':
        frm = ToolForm(request.POST, instance = curr_tool)
        if frm.is_valid():
            frm.save(force_update = True) 
            return render_to_response('tools/tool_edit_success.html')
    else:
        frm = ToolForm(instance = curr_tool)

    args = {}
    args.update(csrf(request))

    args['form'] = frm

    return render_to_response('tools/tool_edit.html', args)

但是,使用更新的信息创建给定工具的全新实例,而不是更新现有的。请注意,我使用的是通常的instance = x。该工具与单个BaseUser相关。如果重要,那么这也是代码。

class BaseUser(AbstractUser):

    zipcode = models.IntegerField(('Zipcode'), max_length=5, blank=True)
    address = models.CharField(('Address'), max_length=40, blank=True)
    shown_username = 'username'


    class Meta:
        verbose_name = 'Base User'

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['first_name',
                       'last_name',
                       'email',
                       'zipcode',
                       'address',
    ]

我有点失落。我读过的每一件事都说这应该是更新而不是创造。

为什么要创建新实例而不是更新旧实例?如何修复代码以便更新旧实例?

1 个答案:

答案 0 :(得分:0)

您是否尝试使用commit=False保存表单,然后使用force_update=True提交/保存模型实例?

我建议保存工具实例:

if frm.is_valid():
    tool = frm.save(commit=False)
    tool.save(force_update=True)