Python- ValueError: слишком много значений для распаковки (ожидалось 2) в Django

Models.py

from django.db import models

class Userreg(models.Model): username= models.CharField(max_length=100) fname= models.CharField(max_length=100) lname= models.CharField(max_length=100) email= models.CharField(max_length=100) pass1= models.CharField(max_length=100) class Meta: db_table="newapp2"

>>

Views.py

from app1.models import Userreg
from django.shortcuts import redirect, render
from django.contrib import messages
from django.contrib.auth import authenticate,login,logout

def signup(request):
    if request.method== "POST":

        username= request.POST['username']
        fname= request.POST['fname']
        lname= request.POST['lname']
        email= request.POST['email']
        pass1 = request.POST['pass1']
        pass2= request.POST['pass2']

        if Userreg.objects.filter(username=username):
            messages.error(request, "Username already exist! Please try some other username.")
            return redirect('home')
        
        if Userreg.objects.filter(email=email).exists():
            messages.error(request, "Email Already Registered!!")
            return redirect('home')
        
        if len(username)>20:
            messages.error(request, "Username must be under 20 charcters!!")
            return redirect('home')
        
        if pass1 != pass2:
            messages.error(request, "Passwords didn't matched!!")
            return redirect('home')
        
        if not username.isalnum():
            messages.error(request, "Username must be Alpha-Numeric!!")
            return redirect('home')

        myuser= Userreg.objects.get(username,email,pass1)
        myuser.first_name= fname
        myuser.last_name= lname

        myuser.save()

TRACEBACK:

  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Desktop\app\app1\views.py", line 36, in signup
    myuser= Userreg.objects.get(username,email,pass1,fname,lname)
  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\db\models\query.py", line 418, in get
    clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\db\models\query.py", line 942, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\db\models\query.py", line 962, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, *args, **kwargs)
  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\db\models\query.py", line 969, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\db\models\sql\query.py", line 1358, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\db\models\sql\query.py", line 1377, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "C:\Users\Anaconda3\envs\anaconda\lib\site-packages\django\db\models\sql\query.py", line 1255, in build_filter
    arg, value = filter_expr
ValueError: too many values to unpack (expected 2)

Если я удалю только `

(myuser= Userreg.objects.get(username,email,pass1))

так что я получил ошибку и на этой странице...

ValueError: Поле 'id' ожидало число, но получило 'S'

Я не знаю, что я сделал неправильно в этом коде? Может ли каждый помочь в этом коде?

Вам необходимо передать ключевое слово args в метод get. Замените свой запрос на следующий:

myuser= Userreg.objects.get(username=username,email=email,pass1=pass1)

Даже если это сделать, ваш код все равно не будет работать так, как задумано, потому что вы отбрасываете существующие имя пользователя и email, но используете те же самые для фильтрации. Либо пользователь будет перенаправлен (если он зарегистрировал свой email/имя пользователя ранее), либо get() вызовет исключение DoesNotExist (если имя пользователя/email не существует в таблице).

Вероятно, вам следует сохранить данные вместо их получения.

Вернуться на верх