繁体   English   中英

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

[英]Django ModelForm creating new instance instead of updating existing database entry

我正在尝试创建一种与与单个用户相关的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',
    ]

我有点迷路了。 我读过的每一件事都说应该更新而不是创建。

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

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

这就是我建议保存Tool实例的方式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM