2014-10-06 95 views
0

我試圖創建與正在與單個用戶Tool對象的工作方式。的Django的ModelForm創建新實例,而不是更新現有的數據庫條目

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', 
    ] 

我有點失落。我讀過的每一件事都說這應該是更新而不是創建。

爲什麼會創建一個新的實例,而不是更新我的舊的實例?我如何修復代碼以便更新我的舊實例?

+0

據我所知,'force_updaet = TRUE;適用於'Model.save()'方法,我不知道如果'ModelForm.save() '方法識別該關鍵字。我檢查了這個頁面,沒有'force_update'的提的是:https://docs.djangoproject.com/en/dev/topics/forms/modelforms – Raiyan 2014-10-06 18:36:58

+0

你確定你正在發佈到正確的方法?你能展示模板嗎? – 2014-10-06 18:57:28

回答

0

您是否嘗試保存表單與commit=False,然後提交/保存模型實例與force_update=True

這是我的建議保存工具實例:

if frm.is_valid(): 
    tool = frm.save(commit=False) 
    tool.save(force_update=True) 
相關問題