2016-10-04 1 views
0

Je ne serai pas besoin d'écrire beaucoup de codes, j'ai juste besoin d'une idée.J'essaie de faire des utilisateurs dans deux catégories différentes.C'est un utilisateur peut avoir un profil ou un magasin à la fois pas tous les deux .Enregistrement de différents types d'utilisateurs dans Django

class Profile(models.Model): 
    user=models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True,editable=True) 

class Shop(models.Model): 
    user=models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True,editable=True) 

Je veux que tous les utilisateurs ont soit l'un des deux, ils enregistreront avec la même forme sans pouvoir passer d'un à l'autre une fois qu'ils se sont inscrits pour it.As à maintenant ce que je fais est Si je ne veux pas d'un utilisateur appartenant boutique à avoir le previlege d'un profil je faire

def post_product(request): 
    try: 
     if bool(request.user.profile)==False: 
      ..... 
    except: 
     pass 

Mais je dois le faire pour toutes les vues qui nécessitent previledges. Je veux l'ensemble du site quelque chose que je peux mettre dans les paramètres ou mettre à la vue comme @login_required .Please comment puis-je aller sur this.Thanks

Répondre

1

Selon réponse donnée par Prabhakar, vous devriez utiliser des groupes auth django. Mais, si vous voulez écrire votre classe d'autorisation personnalisée, vous pouvez également le faire.

1) En supposant nom de fichier -> self_defined_permission.py

from rest_framework import permissions 
from django.contrib.auth.models import Group 

class ShopPermissions(permissions.BasePermission): 
    def has_object_permission(self, request, view, obj): 
     ''' 
     check user group. Assuming you keep users having profile in group 1 and shop in group 2 
     ''' 
     shop_gp = Group.objects.get(id=2) 
     if shop_gp in request.user.groups.all(): 
      return True 
     else: 
      return False 
     ''' 
      similarly you could write permission class for profile owners 
     ''' 

2) À votre avis en fonction de la classe

 from self_defined_permission import ShopPermissions 

    class SomeView(generics.ListCreateAPIView): 
     ... 
     permission_classes = (ShopPermissions,) 

3) Si vous utilisez l'affichage en fonction de la fonction.

from rest_framework.decorators import permission_classes 

    @permission_classes((ShopPermissions,)) 
    def some_view(request): 
     .... 
0

Essayez le user_passes_test décorateur:

from django.contrib.auth.decorators import user_passes_test 

def is_shop(user): 
    return Shop.objects.filter(user=user).exists() 

def is_normal_user(user): 
    return Profile.objects.filter(user=user).exists() 

@user_passes_test(is_shop) 
def only_for_shops(request): 
    return render(request, 'edit_price_list.html')