Bitte verzeihen Sie den Fehler, wie er von einem Anfänger mit einem Memo geschrieben wurde. Ich mache eine Chat-App, möchte aber sicherstellen, dass nur die Teilnehmer im Raum den Chatraum sehen können. Ich habe viel Zeit damit verbracht, es zu implementieren, indem ich die Methoden in der Klassenansicht überschrieb. Es gab einen wahnsinnig einfachen Weg, also werde ich ihn vorstellen.
models.py
class Room(models.Model):
(Abkürzung)
class User(AbstractBaseUser, PermissionsMixin):
(Abkürzung)
class JoinRoom(models.Model):#Zwischentisch
room = models.ForeignKey(Room,on_delete=models.CASCADE)
user = models.ForeignKey(User,on_delete=models.PROTECT)
Es ist vielleicht nicht besser, es hier zu schreiben, aber ich werde es hier der Klarheit halber zusammenfassen. Es scheint, dass get schneller ist als die Verwendung von Filtern, also mache ich das.
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)#Ich habe es noch nicht versucht, wenn ich ersetzen muss.
return True
except MyRoom.DoesNotExist:
return False
class CommentCreateView(OnlyParticipantMixin,generic.CreateView):#Funktioniert es nicht, wenn es nicht in dieser Reihenfolge ist?
template_name = 'hogehoge/hogehoge'
Das ist es. Wenn jemand anders als der Teilnehmer versucht zu gucken, tritt ein Fehler auf.
Referenz
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/