2016-10-11 1 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オーバーライドするので、その問題が発生したと思いますユーザーがオブジェクトの所有者ではありません - このメソッドの戻り値は何も - その私が欲しかったものが、私のフォームクラスは、代わりに新しいオブジェクトを作成しない:

class ClientCreation(forms.ModelForm): 

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

を私はフォームがself.instanceを受信して​​いないので、これが起こっていると思うし、代わりに新しいものを作りなさいuld私はこのような状況ですか?オブジェクトの所有者が現在のユーザーではない場合、新しい投稿を作成する必要はありません。そのような投稿リクエストを送信しても問題ありません。これを正しく実装するにはどうすればいいですか?

UPDATEの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

onwerは、現在のユーザーではないか、いないときに、あなたも404を上げることができますか? –

+0

フルクラスコードをご提供できますか? –

+0

@MosesKoledoyeエラーを発生させたくないテンプレートに適切なメッセージがあり、オブジェクトが届かない – Vova

答えて

3

get_object戻っNone Djangoはあなたがやりたいobject.So新しい代わりのリターンNoneを作成する場合。

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禁じられた

私のtempateページではない – Vova

+0

私は答えを更新しました。それを確認してください – itzMEonTV

+0

ありがとう - 何が仕事ですが、私はスーパー(DistinctClient、自己).dispatch(* args、** kwargs)の代わりにsuper(DistinctClient、self).dispatch(* args、** kwargs)帰りがなければ私はエラーを得たので。 – Vova