2017-02-01 4 views
-1

я использовал рамочное Джанго и рамку REST JWT Auth для маркеров поколенияДжанго рамка отдыха «Кортеж» объект не имеет «ключа» атрибута

serializer.py

from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth import get_user_model 
from django.db.models import Q 
from django.contrib.auth.models import User 

from rest_framework import serializers 
from company.models import Employee 

from rest_framework.authtoken.models import Token 

from rest_framework.serializers import(
    ValidationError, 


    ) 

class UserLoginSerializer(serializers.ModelSerializer): 
    token = serializers.CharField(allow_blank = True , read_only = True) 
    username = serializers.CharField(required = False , allow_blank=True) 
    email = serializers.EmailField(label="Email Adress",required = False, allow_blank=True) 
    class Meta: 
     model = User 
     fields = [ 
      'username', 
      'email', 
      'password', 
      'token', 


     ] 
     extra_kwargs ={"password": 
         {"write_only":True 
         } 
     } 
    def validate(self, data): 
     user_obj = None 
     email = data.get('email', None) 
     username = data.get("username", None) 
     password = data["password"] 
     if not email and not username: 
       raise ValidationError("A username or email is required to login") 

     user=User.objects.filter(
       Q(email=email)| 
       Q(username=username) 

      ).distinct() 
     user = user.exclude(email=None) 
     if user.exists() and user.count() == 1 : 
      user_obj = user.first() 
     else: 
      raise ValidationError("username/email not valid.") 

     if user_obj: 
      if not user_obj.check_password(password): 
       raise ValidationError("Incorrect credentials please try again") 


     token = Token.objects.get_or_create(user=user_obj) 
     #print token.key   
     data["token"] = token.key 


     return data 

ошибка дает в data["token"] = token.key этой линии т.е. 'tuple' object has no attribute 'key'

url.py

url(r'^api/emp/$', x.EmployeeList.as_view(), name='api-Emp'), 
#url(r'^api/emp/(?P<pk>\d+)/$', x.EmployeeDetailAPIView.as_view(), name='api-Detail'), 
url(r'^api/emp/(?P<pk>[\w]+)/$', x.EmployeeDetailAPIView.as_view(), name='api-Detail'), 
#url(r'^(?P<pk>\d+)/$', x.EmployeeDetailAPIView.as_view(), name='api-Detail'), 
url(r'^api/emp/(?P<pk>[\w]+)/update/$', x.EmployeeUpdateAPIView.as_view(), name='emp-api-update'), 
url(r'^api/emp/(?P<pk>[\w]+)/delete/$', x.EmployeeDeleteAPIView.as_view(), name='emp-api-delete'), 
url(r'^create/emp/$', x.EmployeeCreateAPIView.as_view(), name='emp-api-create'), 
url(r'^api/user/$', x.UserDeatilAPIView.as_view(), name='api-user'), 


#register UserLoginAPIView 
url(r'^register/$', x.UserCreateAPIView.as_view(), name='register'), 
url(r'^login/$', x.UserLoginAPIView.as_view(), name='api-login'), 

#jwt 
url(r'^api/token/auth/', obtain_jwt_token), 
url(r'^api/token/refresh/', refresh_jwt_token), 
url(r'^api/token/verify/', verify_jwt_token), 

jwt last 3 links auth, обновить и проверить работу отлично, но пользовательский serilizer не работает. дайте мне какое-нибудь предложение, если я ошибаюсь!

ответ

1

get_or_created возвращает кортеж объекта и bool, показывающий, был ли он создан. Поскольку вам не кажется, что это касается второго, вы можете просто назначить его временной переменной.

token, created = Token.objects.get_or_create(user=user_obj) 
Смежные вопросы