2016-10-11 3 views
1

내 문제 :장고 UpdateView 새로운 객체를 생성

def get_object(self, queryset=None): 
    try: 
     object_get = self.model.objects.get(pk=self.kwargs['pk']) 
    except ObjectDoesNotExist: 
     raise Http404("No object found matching this query") 

    if self.request.user.is_authenticated(): 
     if object_get.owner == self.request.user: 
      return object_get 

그리고 현재의 경우를 : UpdateView 대신 이전 업데이트의 새로운 객체를 생성, 난 내보기의 클래스 정의에서이 같은 방법을 get_object 무시하기 때문에 그 일이 생각 사용자가 개체의 소유자가 아닌 없다 -이 메소드의 반환 아무것도 -는 내가 원하는,하지만 내 폼 클래스 대신에 새로운 객체 생성 무엇을 : 나는 형태가 self.instance을받지 않기 때문에 이런 일이 생각

class ClientCreation(forms.ModelForm): 

    class Meta: 
     model = Client 
     fields = ('name', 'loyal') 

및 대신 새로운 것을 만드십시오 - 무슨 우 uld 나는이 상황에서합니까? 개체의 소유자가 현재 사용자가 아닌 경우 새로운 게시물을 생성하고 싶지 않습니다. 그런 다음 게시 요청을 보내지 않아도됩니다. 어떻게 올바르게 구현해야합니까?

업데이트 views.py :

UpdateView에서
class Distinct(generic.UpdateView): 
    def get_object(self, queryset=None): 
     try: 
      object_get = self.model.objects.get(pk=self.kwargs['pk']) 
     except ObjectDoesNotExist: 
      raise Http404("No object found matching this query") 

     if self.request.user.is_authenticated(): 
      if object_get.owner == self.request.user: 
       return object_get 

    def get_form_kwargs(self): 
     kwargs = super(Distinct, self).get_form_kwargs() 
     if self.request.user.is_authenticated(): 
      kwargs.update({'user': self.request.user}) 
     return kwargs 

    def post(self, request, *args, **kwargs): 
     if request.POST.get('action', '') == 'Delete': 
      object_get = self.get_object() 
      request.session['deleted_data'] = str(object_get) 
      object_get.delete() 
      return redirect(reverse('crm:main')) 
     else: 
      return super(Distinct, self).post(request, *args, **kwargs) 

    def get_success_url(self): 
     return reverse('crm:{}'.format(self.distinct_template), kwargs={'pk': self.kwargs['pk']}) 

class DistinctClient(Distinct): 

    form_class = ClientCreation 
    model = Client 
    template_name = 'crm/client_detail.html' 
    all_template = 'clients' 
    distinct_template = 'client' 

    def get_form_kwargs(self): 

     return generic.UpdateView.get_form_kwargs(self) 
+2

그런 다음 당신은 또한 404을 올릴 수 있을까? –

+0

전체 등급 코드를 제공해 주시겠습니까? –

+0

@MosesKoledoye 어떤 오류라도 발생시키고 싶지 않다. 내 템플릿에 적절한 메시지가있다. 객체를받지 못한다. – Vova

답변

3

, None 반환 get_object 경우 장고 대신 반환 None 당신이 원하는 무엇이든의 새로운 object.So을 만듭니다. onwer 현재 사용자가 아니거나하지 않을 때

def get_object(self, queryset=None): 
    try: 
     object_get = self.model.objects.get(pk=self.kwargs['pk']) 
    except ObjectDoesNotExist: 
     raise Http404("No object found matching this query") 

    if self.request.user.is_authenticated(): 
     if object_get.owner == self.request.user: 
      return object_get 
    raise My #do something here. 

UPDATE

class My(Exception): 
    pass 
class DistinctClient(Distinct): 

    form_class = ClientCreation 
    model = Client 
    template_name = 'crm/client_detail.html' 
    all_template = 'clients' 
    distinct_template = 'client' 

    def dispatch(self, *args, **kwargs): 
     try: 
      return super(DistinctClient, self).dispatch(*args, **kwargs) 
     except My: 
      return redirect #to do or (return render(self.request, 'mytemplate.html', {})) 
+0

내 템플릿을 사용자에게 보내려면 어떤 예외가 발생해야하며, PermissionDenied를 높이려고 시도하지만,이 경우 나는 다만 얻는다

403 Forbidden

나의 tempate 페이지가 아니다 – Vova

+0

나는 대답을 새롭게했다. 그것을 확인하십시오 – itzMEonTV

+0

고마워요 - 무슨 일 이죠,하지만 슈퍼 (DistinctClient, 자기) 대신에 super (DistinctClient, self) .dispatch (* args, ** kwargs)를 돌려 주어야한다고 생각합니다 .dispatch (* args, ** kwargs) 돌아 오지 않으면 오류가 생기기 때문입니다. – Vova

관련 문제