2014-10-06 1 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() 

이 도구는 도구가이보기

@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) 

에 의해 이루어집니다이 양식

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_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

AFAIK는'force_updaet = TRUE '는 Model.save()'적용'방법은 잘 모르겠어요 경우'ModelForm.save() '메소드는 해당 키워드를 인식합니다. 나는이 페이지를 체크했다.'force_update'에 대한 언급은 없다. https://docs.djangoproject.com/en/dev/topics/forms/modelforms – Raiyan

+0

올바른 방법으로 게시하고 싶습니까? 템플릿을 보여줄 수 있습니까? –

답변

0

commit=False으로 양식 저장을 시도한 다음 force_update=True과 함께 모델 인스턴스를 커밋/저장 했습니까?

이 내가 도구 인스턴스 절약 제안하는 방법입니다

if frm.is_valid(): 
    tool = frm.save(commit=False) 
    tool.save(force_update=True) 
관련 문제