无法将关键字 'approve_moderator' 解析为字段。选项有:id、user、user_id
Cannot resolve keyword 'approve_moderator' into field. Choices are: id, user, user_id
问题概要:
我正在实施一个登录逻辑,检查用户是否已注册并在 MODERATOR 组中(用户在注册时自动添加到 MODERATOR 组)且“approve_moderator”状态设置为 True .默认情况下,字段“approve_moderator”为 False。现在在登录期间,我检查用户是否是注册用户并在将他们重定向到版主仪表板之前获得批准
views.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 })
models.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
您为 Moderator
过滤了 相关用户 的 approved_moderator=True
,而不是 Moderator
本身,因此您应该过滤:
approval_status = Moderator.objects.filter(
user_id=request.user.id,
<strong>user__approve_moderator=True</strong>
)
问题概要:
我正在实施一个登录逻辑,检查用户是否已注册并在 MODERATOR 组中(用户在注册时自动添加到 MODERATOR 组)且“approve_moderator”状态设置为 True .默认情况下,字段“approve_moderator”为 False。现在在登录期间,我检查用户是否是注册用户并在将他们重定向到版主仪表板之前获得批准
views.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 })
models.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
您为 Moderator
过滤了 相关用户 的 approved_moderator=True
,而不是 本身,因此您应该过滤:Moderator
approval_status = Moderator.objects.filter(
user_id=request.user.id,
<strong>user__approve_moderator=True</strong>
)