Не удается преобразовать ключевое слово 'approve_moderator' в поле. Варианты: 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,
user__approve_moderator=True
)