Veuillez pardonner l'erreur car elle est écrite par un débutant avec un mémo. Je crée une application de chat, mais je veux m'assurer que seuls les participants de la salle peuvent voir la salle de discussion. J'ai passé beaucoup de temps à essayer de l'implémenter en remplaçant les méthodes dans la vue de classe Il y avait un moyen incroyablement simple, alors je vais le présenter.
models.py
class Room(models.Model):
(Abréviation)
class User(AbstractBaseUser, PermissionsMixin):
(Abréviation)
class JoinRoom(models.Model):#Table intermédiaire
room = models.ForeignKey(Room,on_delete=models.CASCADE)
user = models.ForeignKey(User,on_delete=models.PROTECT)
Il n'est peut-être pas préférable de l'écrire ici, mais je vais le résumer ici par souci de clarté. Il semble que get soit plus rapide que d'utiliser un filtre, alors je le fais.
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)#Je n'ai pas encore essayé si j'ai besoin de remplacer.
return True
except MyRoom.DoesNotExist:
return False
class CommentCreateView(OnlyParticipantMixin,generic.CreateView):#Cela ne fonctionne pas à moins que ce soit dans cet ordre?
template_name = 'hogehoge/hogehoge'
C'est ça. Si quelqu'un d'autre que le participant essaie de regarder, une erreur se produit.
référence
https://developer.yukimonkey.com/article/20200417/
https://intellectual-curiosity.tokyo/2018/12/06/django%E3%81%AE%E8%A9%B3%E7%B4%B0%E7%94%BB%E9%9D%A2detailview%E3%81%A7%E8%87%AA%E5%88%86%E4%BB%A5%E5%A4%96%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%82%A2%E3%82%AF/