簡體   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