Request.session['pk'] = user.pk AttributeError: объект 'QuerySet' не имеет атрибута 'pk'
Мне нужно получить пользователя для account_verify, чтобы сравнить введенный код проверки с правильным кодом входа, но я получил эту ошибку, также я хочу показать номер телефона пользователя в account verify я использовал контекст для этого, но я думаю, что это неправильно
view
def account_register(request):
if request.user.is_authenticated:
return redirect("store:home")
if request.method == "POST":
registerForm = RegistrationForm(request.POST)
if registerForm.is_valid():
username = registerForm.cleaned_data["user_name"]
phone_number = registerForm.cleaned_data["phone_number"]
password = registerForm.cleaned_data["password"]
user = User.object.filter(phone_number=phone_number)
if not user.exists():
new_user = User(phone_number=phone_number)
new_user.username = username
new_user.phone_number = phone_number
new_user.set_password(password)
new_user.is_active = False
new_user.save()
else:
return HttpResponse("this phone number already taken", status=400)
request.session['pk'] = user.pk
return redirect("account:account_verify")
else:
registerForm = RegistrationForm()
return render(request, "account/authentication.html", {"form": registerForm})
def account_verify(request):
form = CodeForm(request.POST or None)
print(form)
pk = request.session.get('pk')
print(pk)
if pk:
user = User.object.get(pk=pk)
code = user.code
user_phone_number = user.phone_number
code_user = f"{user.code}"
if not request.POST:
print(code_user)
send_sms(code_user, user.phone_number)
if form.is_valid():
num = form.cleaned_data.get('number')
if str(code) == num:
user.is_active = True
user.save()
login(request, user)
return redirect("store:home")
else:
return redirect("account:register")
context = {
'form': form,
'user_phone_number': user_phone_number
}
return render(request, "account/verify.html", context)
error
File "C:\Users\_rickoutis_\djx\Rex_acs32\account\views.py", line 49, in account_register
request.session['pk'] = user.pk
AttributeError: объект 'QuerySet' не имеет атрибута 'pk'
по поводу вашей проблемы: Когда вы звоните:
user = User.object.filter(phone_number=phone_number)
Вы получаете объект QuerySet. QuerySet не имеет доступа к атрибутам. Если вы хотите использовать телефонный_номер конкретного пользователя, замените эту строку кода на следующую:
user = User.object.get(phone_number=phone_number)
Используя оператор 'get' вместо 'filter', вы получаете доступ к определенным записям в базе данных, которые позволяют вам использовать их атрибуты.
ошибка в следующей строке:
user = User.object.filter(phone_number=phone_number)
метод filter возвращает список объектов, поэтому он не объектного типа, для решения этой проблемы используйте get() вместо этого, измененная строка выглядит так:
user = User.object.get(phone_number=phone_number)
Используйте filter().first()
, чтобы избежать этой проблемы, а также, если он не уникален в ваших моделях, было бы хорошо сделать его таким
user = User.objects.filter(phone_number=phone_number).first()
так вы предотвратите MultipleObjectsReturned
ошибку.
но я бы рекомендовал вам сделать этот номер телефона unique=True