字段“id”需要一个数字,但得到(<Group:STUDENT>,False)

2024-09-24 22:32:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个注册表单,我想注册一个学生,实例化一个学生模型,并将其添加到该模型中。我有一个CustomUser模型,它被学生模型引用

客户用户模型

class CustomUser(AbstractUser):
    email = models.EmailField(_('email address'), unique=True)
    phone = models.CharField(max_length=150, null=True, blank=True)
    address = models.CharField(max_length=200, null=True, blank=True)
    profile_picture = models.ImageField(default='images/student.png', upload_to='profile_picture/', null=True, blank=True)
    is_student = models.BooleanField(default=False)
    is_moderator = models.BooleanField(default=False)
    is_administrator = models.BooleanField(default=False)

    def __str__(self):
        return self.get_username()

学生模型

class Student(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    @property
    def get_instance(self):
        return self

    def __str__(self):
        return self.user.username

视图.py

from django.contrib.auth.models import Group
from student.models import Student
from quiz.forms import RegistrationForm

def register_student_view(request):
    form = RegistrationForm()
    if request.method == 'POST':
        form = RegistrationForm(request.POST, request.FILES)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_student = True
            user.save()
            student = Student.objects.create(user=user)
            student_group = Group.objects.get_or_create(name='STUDENT')
            student.user.groups.add(student_group)
            messages.success(request, 'Registration successful!')
            return redirect('login')

    form = RegistrationForm()
    return render(request, 'accounts/register.html', {'form': form })

完全错误跟踪路径

Traceback (most recent call last):
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py", line 1823, in get_prep_value
    return int(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/student/views.py", line 29, in register_student_view
    student.user.groups.add(student_group)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 950, in add
    self._add_items(
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 1126, in _add_items
    target_ids = self._get_target_ids(target_field_name, objs)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 1073, in _get_target_ids
    target_ids.add(target_field.get_prep_value(obj))
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/related.py", line 977, in get_prep_value
    return self.target_field.get_prep_value(value)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py", line 1825, in get_prep_value
    raise e.__class__(
TypeError: Field 'id' expected a number but got (<Group: STUDENT>, False).

我不想直接使用CustomUser并直接从中呼叫用户。我不希望从CustomUser调用用户,而是希望用户位于学生模型中,该模型具有CustomUser的外键,然后我可以使用学生实例执行业务逻辑


Tags: djangopydevselflivehomegetmodels
1条回答
网友
1楼 · 发布于 2024-09-24 22:32:45

^{}实际上返回一个元组,该元组由对象和一个表示对象是否已创建的标志组成,因此您需要捕获这两个元组并只使用student_group对象:

            student_group, created = Group.objects.get_or_create(name='STUDENT')
                        # ^^^ Add this
            student.user.groups.add(student_group)

相关问题 更多 >