##前書き
メモがてら初心者が書いているので、間違いはご容赦ください。
チャットアプリを作っているのですが、チャットルームを部屋の参加者以外覗けないようにしたくなりました。
クラスビューのメソッドのオーバーライドで実装しようとして、かなり時間を費やしましたが、
めちゃくちゃ簡単な方法がありましたのでご紹介します。
##本題
※中間テーブルで参加者を管理しています。(該当のレコードがあれば参加済)
models.py
class Room(models.Model):
(略)
class User(AbstractBaseUser, PermissionsMixin):
(略)
class JoinRoom(models.Model):#中間テーブル
room = models.ForeignKey(Room,on_delete=models.CASCADE)
user = models.ForeignKey(User,on_delete=models.PROTECT)
本当はここに書かないほうがいいのかもしれませんが、見やすくするためこちらにまとめます。
filterを使うより、getのほうが早くていいらしいのでこうしてます。
views.py
from django.contrib.auth.mixins import UserPassesTestMixin
class OnlyParticipantMixin(UserPassesTestMixin):
raise_exception = True
def test_func(self):
try:
exist_or_not = MyRoom.objects.get(room=self.kwargs['pk'],user=self.request.user)#代入する必要があるのかはまだ試してません。
return True
except MyRoom.DoesNotExist:
return False
class CommentCreateView(OnlyParticipantMixin,generic.CreateView):#この順番じゃないと機能しないっぽい?
template_name = 'hogehoge/hogehoge'
これで完了。参加者以外が覗こうとしたらエラーが出るようになります。
参考