2016-09-20 12 views
0

は、私はインターネットのようなソリューションで見つかった:割り当てられたメソッドに追加の属性を送信する方法は?

def is_owner(self): 
    if self.request.user.profile_url == self.kwargs['profile_url']: 
     return True 
    else: 
     raise PermissionDenied 

class CompanyProfileUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): 
    model = CompanyProfile 
    template_name = 'profiles/create.html' 
    fields = ['user', 'name'] 

    test_func = is_owner 

誰が、どのようにメソッドに付加価値を送信する方法を教えてもらえますか?何self

P.S.がないため、動作していない、明らかに

def is_owner(self, profile_type): 
    if profile_type == 'user': 
     if self.request.user.profile_url == self.kwargs['profile_url']: 
      return True 
     else: 
      raise PermissionDenied 

    else: 
     # some code 

test_func = is_owner('user'): 私のようなものを持ちたいですtest_funcUserPassesTestMixinクラスのメソッドです

答えて

1

UserPassesTestMixinに変更を加えることはできません。より簡単な解決策は、kwargをurls.pyファイルのビューに提供するか、またはクラスの異なるprofile_typeプロパティを持つビューの新しいサブクラスを作成することです。例えば

class CompanyProfileUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): 
    model = CompanyProfile 
    template_name = 'profiles/create.html' 
    fields = ['user', 'name'] 

    def test_func(self): 
     if self.kwargs['profile_type'] == 'user': 
      if self.request.user.profile_url == self.kwargs['profile_url']: 
       return True 
      else: 
       raise PermissionDenied 
     else: 
      # something 
      pass 

urlpatterns += [ 
    url('^$', views.CompanyProfileUpdateView.as_view(), name='update_user', kwargs={'profile_type': 'user'}), 
    url('^$', views.CompanyProfileUpdateView.as_view(), name='update_other', kwargs={'profile_type': 'other type'}) 
] 

番目のオプション:

class CompanyProfileUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): 
    model = CompanyProfile 
    template_name = 'profiles/create.html' 
    fields = ['user', 'name'] 

    profile_type = 'user' 
    def test_func(self): 
     if self.profile_type == 'user': 
      if self.request.user.profile_url == self.kwargs['profile_url']: 
       return True 
      else: 
       raise PermissionDenied 
     else: 
      # something 
      pass 

class OtherProfileUpdateView(CompanyProfileUpdateView): 
    profile_type = 'other type' 
+0

第一選択肢が許容されます。 1) 'def is_owner(self):'はクラス外になければなりません2 '' $ $ '、views.CompanyProfileUpdateView.as_view(kwargs = {' profile_type ':' user '}) 、name = 'update_user')、 'は動作しません。私はそれを 'url('^$ '、views.CompanyProfileUpdateView.as_view()、kwargs = {' profile_type ':' user '}、name =' update_user ')に変更する必要があります。 – TitanFighter

+0

ドキュメントによると、他に何かを割り当てるのではなく、単に 'test_func'をオーバーライドするだけです。 – schillingt

+0

はい、私は知っています:)しかし、私は所有者をチェックする9つのビューを持っているので、コードの繰り返しや 'django-imagestore'のソースで見つけた割り当てトリックを避けたいです - https://github.com/hovel/imagestore /blob/master/imagestore/views.py – TitanFighter

関連する問題