python - 无法将关键字“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
解决方案
您过滤Moderator
具有相关用户approved_moderator=True
的 a ,而不是其本身,因此您应该过滤:Moderator
approval_status = Moderator.objects.filter(
user_id=request.user.id,
user__approve_moderator=True
)
推荐阅读
- coinbase-api - 汇率似乎不一致。某些货币不显示,但在某些级别受支持
- python - django 链接到另一个页面确实呈现新页面
- c# - 方法不从另一个方法返回随机数
- c# - 数据模板中的数据绑定自定义用户控件
- typescript - 打字稿处理编译错误
- php - 限制单个输入字段中的重复
- javascript - 循环数据以使用 JavaScript 创建具有键/值对的字典
- python-3.x - Tkinter - 在askopenfilename之后在帧之间传递变量?
- python - 如何在 Jython 中添加 PILLOW 库
- c - C“gets”命令输入只是跳到结束而不是等待我的输入