2017-01-13 9 views
1

オブジェクトのインスタンスをOneToOneFieldを介してそのオブジェクトが参照するユーザーのみに表示できるように制限しようとしています。私はDetailViewで "user_passes_test" mixinを使用して、OnetoOne関係でrequest.userをユーザーと比較しています。私はdjango ircの助けを得て、get_objectをうまく試して実装しようとしましたが、私はまだ固執しています(私はDjango & Pythonには初めてです)。Django - user_passes_test mixinの変数として関連するオブジェクトを渡します。

モデル:

class Event(models.Model):  
    client = models.OneToOneField(settings.AUTH_USER_MODEL) 

ビュー:

class EventDetail(UserPassesTestMixin, DetailView): 
    model = Event 

    def test_func(self): 
     if self.request.user == self.model.client: 
      return True 
     else: 
      return False 

ユーザーがユーザー(AbstractUser)として、独自のアプリで参照されている

+0

どのようにこの 'test_func'関数を使用していますか? – AKS

答えて

1

あなたの場合DetailViewを使用している場合は、thビュー内の電子get_queryset方法:

class EventDetail(DetailView): 
    model = Event 

    def get_queryset(self): 
     queryset = super(DetalView, self).get_queryset() 
     return queryset.filter(client=self.request.user) 

これはEventオブジェクトはクライアントとしてのみユーザーに制限されていることを確認します。

イベントにアクセスするためにどのURLを使用しているのか、EventUserの間にちょうどOneToOneの関係があるのか​​どうかわかりません。しかし、それがOneToOneの関係の場合、この実装後のquerysetには1つのオブジェクトしか含まれません。 (これは、このイベントにアクセスしている主キーである場合とそうでない場合があります)。私は最終的にそれを得た

+0

私はForeignKey上でOneToOneを使用しています。なぜなら、常に1人のユーザーと関連した1つのイベントが存在するからです。 – brandondavid

+0

(私はコメントを保存して入力を打つことを認識していませんでした) - urlはpkでイベントオブジェクトを呼び出しています:http:// localhost:8000/events/3/ - テスト関数でget_querysetの出力を使用します。 – brandondavid

+0

私はあなたのソリューションがテスト機能を置き換えたことを知りました。しかし、テスト関数を使っていたので、 "staff"とマークされたユーザがオブジェクトを見ることを可能にするif/else条件を提供することもできました。あなたのソリューションを使用して、どのように機能チェックを行い、ユーザーがスタッフであれば許可しますか? – brandondavid

1

は、私はそれは私が、私はちょうどこのようにクエリセットでのif/else条件を置くことが実現することを書き出す取ったと思う:

def get_queryset(self): 
    queryset = super(DetailView, self).get_queryset() 
    if self.request.user.is_staff: 
     return queryset 
    else: 
     return queryset.filter(client=self.request.user) 

はあなたにAKSをありがとう!

関連する問題