2013-10-22 5 views
1

전 생애에 걸쳐 업데이트 될 모델이 있습니다. 각 업데이트가 원본을 업데이트하는 대신 이전 개체를 기반으로 새 개체를 반환하도록합니다. 이것은 사용자가 이전 오브젝트를 참조로 겹쳐 쓰지 않도록하면서 오브젝트를 제공하기위한 것입니다. 나는 동일한 양식을 사용하여 시도했는데, this question은 내가 원한 것을 성취 할 수 있다고 제안했으나 대신 업데이트했다. 그런 다음 save 메서드를 재정의하여 아래 코드에서와 같이 CreateView를 가리 키려고 시도했지만 CreateView 인스턴스가 첫 번째 인수로 필요하다고 말했습니다. 내가 원하는 행동을 취할 수있는 방법이 있습니까?대신 django UpdateView를 사용하여 새 객체를 만듭니다.

class TriageUpdateView(PermissionRequiredMixin, UpdateView): 
    model = Triage 
    form_class = TriageForm 
    login_url = "/login/" 
    permission_required = "myapp.add_triage" 

    def form_valid(self, form): 
     obj = form.save(commit = False) 
     obj.completed_by = self.request.user.person 
     return TriageCreateView.form_valid(self, form) 

답변

3

내가 가장 좋은 방법인지는 모르지만 방법을 찾았습니다. Django는 기본 키 값을 확인하여 데이터베이스를 업데이트할지 삽입할지 결정합니다. 유효성 검사에서 이것을 None으로 설정하면 트릭이 완료됩니다. (PK = 없음) 확실히 작동하지 않습니다

class TriageUpdateView(PermissionRequiredMixin, UpdateView): 
    model = Triage 
    form_class = TriageForm 
    login_url = "/login/" 
    permission_required = "myapp.add_triage" 

    def form_valid(self, form): 
     obj = form.save(commit = False) 
     obj.pk = None 
     obj.completed_by = self.request.user.person 
     return super(TriageUpdateView, self).form_valid(form) 
1

귀하의 솔루션 (그리고 장고 문서의 기능으로 문서화되어 - 그러므로 그것은뿐만 아니라 미래에 wirk한다),하지만 당신은 수동으로 수행하려는 경우, 당신은 할 수 다음을 수행하십시오.

form_valid(self, form)create_new_triage(form.instance, self.request.user.person) 전화를 걸어주세요. form.incance은 사용자가 입력 한 모델의 현재 인스턴스를 보유하고 있으므로 해당 값을 Triage.objects.create() 메소드에서 사용할 수 있습니다.

이렇게하면 제어력이 향상되지만, pk = None으로 설정하면 원하는대로 할 수 있습니다.

관련 문제