【问题标题】:Django ModelForm creating new instance instead of updating existing database entryDjango ModelForm 创建新实例而不是更新现有数据库条目
【发布时间】:2014-12-01 01:43:14
【问题描述】:

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

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

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

【问题讨论】:

  • AFAIK,force_updaet=True 适用于Model.save() 方法,我不确定ModelForm.save() 方法是否识别该关键字。我检查了这个页面,没有提到force_updatedocs.djangoproject.com/en/dev/topics/forms/modelforms
  • 您确定发布到正确的方法吗?可以展示一下模板吗?

标签: python django


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多