![](/img/trans.png)
[英]builtins.AttributeError: 'NoneType' object has no attribute 'check_password'
[英]AttributeError:'Student' object has no attribute 'check_password'
我使用名為Student的自定義用戶模型,該模型繼承了Django用戶模型。 當我想使用check_password時,我在登錄時遇到問題。 錯誤是作為自定義用戶模型的Student沒有這樣的屬性。
我想用他們注冊的信息登錄學生。 並且要登錄的字段是identity_no和student_no。
models.py:
class CustomUser(AbstractUser):
USER_TYPE_CHOICES = ((1, 'student'),
(2, 'professor'),)
username = models.CharField(max_length=50, unique=True)
user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES, null=True)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=100)
identity_no = models.PositiveIntegerField(default=0)
email = models.EmailField(max_length=300,
validators=[RegexValidator
(regex="^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.["r"a-zA-Z0-9-.]+$",
message='please enter the correct format')],
)
date_joined = models.DateTimeField('date joined', default=timezone.now)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
class Student(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
entry_year = models.PositiveIntegerField()
student_no = models.PositiveIntegerField()
def get_full_name(self):
return self.user.first_name + self.user.last_name
def __unicode__(self):
return self.get_full_name()
views.py:
class StudentLoginSerializer(serializers.ModelSerializer):用戶= CustomUserSerializerForLogin()
class Meta:
model = Student
fields = [
"user",
"student_no", ]
def validate(self, data): # validated_data
user_data = data.pop('user', None)
identity_no = user_data.get('identity_no')
print("identity_no", identity_no)
student_no = data.get("student_no")
user = Student.objects.filter(
Q(user__identity_no=identity_no) |
Q(student_no=student_no)
).distinct()
# user = user.exclude(user__identity_no__isnull=True).exclude(user__identity_no__iexact='')
if user.exists() and user.count() == 1:
user_obj = user.first()
else:
raise ValidationError("This username or student_no is not existed")
if user_obj:
if not user_obj.check_password(student_no): # Return a boolean of whether the raw_password was correct.
raise ValidationError("Incorrect Credential please try again")
return user_obj
我打印(dir(user_obj)),輸出是:
['DoesNotExist', 'MultipleObjectsReturned', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_check_column_name_clashes', '_check_field_name_clashes', '_check_fields', '_check_id_field', '_check_index_together', '_check_local_fields', '_check_long_column_names', '_check_m2m_through_same_relationship', '_check_managers', '_check_model', '_check_model_name_db_lookup_clashes', '_check_ordering', '_check_swappable', '_check_unique_together', '_do_insert', '_do_update', '_get_FIELD_display', '_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val', '_get_unique_checks', '_meta', '_perform_date_checks', '_perform_unique_checks', '_save_parents', '_save_table', '_set_pk_val', '_state', 'check', 'clean', 'clean_fields', 'courserelationstudent_set', 'date_error_message', 'delete', 'entry_year', 'from_db', 'full_clean', 'get_deferred_fields', 'get_full_name', 'id', 'objects', 'pk', 'prepare_database_save', 'refresh_from_db', 'save', 'save_base', 'serializable_value', 'student_no', 'unique_error_message', 'user', 'user_id', 'validate_unique']
實際上沒有check_password。 問題是如何檢查輸入的student_no是否正確。
由於您的Student
模型與用戶具有外鍵關系,因此您應在此處分配學生的用戶:
class StudentLoginSerializer(serializers.ModelSerializer):
...
def validate(self, data): # validated_data
student = Student.objects.filter(
Q(identity_no=identity_no) |
Q(student_no=student_no)
).distinct()
if student.exists() and student.count() == 1:
user_obj = student.first().user
# ________________________^
...
參考 如何在Django Rest API框架中登錄自定義用戶模型 (這是同一用戶的先前問題,這就是為什么我知道模型層次結構的原因)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.