0
votes

Comment créer des liens à Django de manière à ce que d'autres utilisateurs ne peuvent pas y accéder?

Je suis assez confus sur comment puis-je empêcher les utilisateurs d'accéder aux données des autres utilisateurs.

Le boîtier à la main:

Je crée une application Notes + à faire dans lequel un utilisateur se connecte, crée leurs notes et leurs tâches.

Comment créer des liens vers ces notes de telle sorte qu'ils ne sont pas accessibles par d'autres utilisateurs? Comme dans la syntaxe correcte pour userPassestestMixin.

Dans l'application TO-DO, comment puis-je conserver les tâches d'un utilisateur uniques? De même pour l'application Note, comment puis-je atteindre cela?


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser le décorateur de Django appelé "user_passes_test"

Vous pouvez importer comme: xxx

pour vérifier les documents ici


0 commentaires

1
votes

Si vous utilisez des fonctions (FBV), vous pouvez utiliser si demande.user == item.user == Item.user xxx

CBV - Vue basée sur la classe - Utilisation de userPassestestMixin xxx


1 commentaires

Cela semble cool mais qu'en est-il des URLS.PY? les urls.py auraient probablement quelque chose comme chemin ('post / /', postdetailview.as_view (), nom = 'post-détail'), et cela signifierait que n'importe qui Avec ce lien pourrait y accéder, je suppose. Mais bien je vais essayer. Merci beaucoup pour l'aide.



1
votes

Je ne sais pas ce que vous entendez par "Créer des liens". Pour ce que vous décrivez, les liens ne changent pas pour les personnes qui ont accès ou non. La différence si un utilisateur qui possède la note 5 et va à / note / 5 / code>, ils doivent pouvoir voir leur note, mais si un autre utilisateur va à / Note / Note / 5 / Ils devraient soit 1) Obtenir une erreur 404 (note non trouvée) ou 403 (la permission refusée) juste être redirigée vers une autre page (par exemple, la page d'accueil), peut-être avec un message.

Utilisation de vues basées sur la classe, Ceci est facile à faire. p>

empêche l'accès aux vues h2> xxx pré>

si vous souhaitez simplement diriger les utilisateurs vers une autre page, vous feriez quelque chose comme: P>

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
from django.contrib import messages

class NoteView(DetailView):
  model = Note
  template_name = 'note/details.html'

  def get_context_data(self, **kwargs):
     context = super(NoteView, self).get_context_data(**kwargs)
     # Add any special context for the template
     return context

  @method_decorator(login_required)
  def dispatch(self, request, *args, **kwargs):
     note = self.get_objet()
     if note and not note.user == self.request.user:
        messages.error(
            self.request,
            'You are not allowed to access this Note'
        )
        return HttpResponseRedirect('/home')
    return super(NoteView, self).dispatch(request, *args, **kwargs)


3 commentaires

Merci beaucoup, mais je pense que je l'ai maintenant: p. J'ai utilisé la UserPassestestMixin pour l'erreur interdite 403. classesLisview (loginrequirepirémixin, listview): Modèle = notes context_object_name = 'notes' def get_queryset (auto): retour notes.Object.filter (utilisateur = auto.request.utiliser) La userPassestestMixin a été utilisée sur le Mettez à jour, créez et supprimez des vues.


Cela peut remplacer l'autre méthode, mais étant donné que userPassestestMixin ne prend que l'utilisateur comme un argument, vous devez toujours appeler get_Object ou quelque chose pour obtenir l'objet, il s'agit donc d'une solution beaucoup plus courante pour écraser cette fonction Get_Object. Mais c'est à vous de décider.


Ouais exactement j'ai écrit une fonction de test. def test_func (auto): Notes = Self.get_Object () Si auto.Request.user == Remarques.User: retourne vrai