首页 > 解决方案 > 无法将关键字“approve_moderator”解析为字段。选项有:id、user、user_id

问题描述

问题概要:

我正在实现一个登录逻辑,该逻辑检查用户是否已注册并在 MODERATOR 组中(用户在注册时自动添加到 MODERATOR 组),“approve_moderator”状态设置为 True。默认情况下,“approve_moderator”字段为 False。现在在登录期间,我检查用户是否是注册用户并在将他们重定向到主持人仪表板之前获得批准

视图.py


def is_moderator(user):
    '''check if registered and in moderator group'''
    return user.groups.filter(name='MODERATOR').exists()

def afterlogin_view(request):
    if is_student(request.user):
        messages.success(request, 'successfully logged in as ' + request.user.username)
        return redirect('student-dashboard')

    elif is_moderator(request.user):
        approval_status = Moderator.objects.all().filter(user_id=request.user.id, approve_moderator=True)
        if approval_status:
            return redirect('moderator-dashboard')
        else:
            return redirect('moderator-wait-approval')
    elif is_admin(request.user):
        return redirect('admin-dashboard')
    else:
        return redirect('login')

def register_moderator_view(request):
    if request.user.is_authenticated and request.user.is_moderator:
        return redirect('moderator-dashboard')
    else:
        form = RegistrationForm()
        if request.method == 'POST':
            form = RegistrationForm(request.POST, request.FILES)
            if form.is_valid():
                user = form.save(commit=False)
                user.is_moderator = False
                user.save()
                moderator = Moderator.objects.create(user=user)
                moderator_group, created = Group.objects.get_or_create(name='MODERATOR')
                moderator.user.groups.add(moderator_group)
                messages.info(request, 'Registration successful!')
                return redirect('login')
            # else:
            #     messages.warning(request, 'Form invalid!')
        form = RegistrationForm()
    return render(request, 'accounts/register.html', {'form': form })

模型.py

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)
    approve_moderator = models.BooleanField(default=False)

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

class Moderator(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

完整回溯

Internal Server Error: /afterlogin/
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/quiz/views.py", line 45, in afterlogin_view
    approval_status = Moderator.objects.all().filter(user_id=request.user.id, approve_moderator=True)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/query.py", line 941, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/query.py", line 961, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/query.py", line 968, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1393, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1412, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1286, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1112, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1539, in names_to_path
    raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword 'approve_moderator' into field. Choices are: id, user, user_id

标签: pythondjangodjango-modelsdjango-viewsdjango-templates

解决方案


您过滤Moderator具有相关用户approved_moderator=True的 a ,而不是其本身,因此您应该过滤:Moderator

approval_status = Moderator.objects.filter(
    user_id=request.user.id,
    user__approve_moderator=True
)

推荐阅读