Как передать параметр метода представления пользователю при прохождении теста в django?
У меня есть метод представления, такой как
@login_required(login_url='/users/login')
def my_submission(request,submission_id):
submission = Submission.objects.get(pk=submission_id)
return render(request, "assignments/mysubmission.html", {
"submission": submission
})
Мне интересно, есть ли способ передать submission_id, который является вторым параметром декоратора user passes test, чтобы я мог сделать что-то вроде
@user_passes_test(lambda u: u.id == Submission.objects.get(pk=submission_id).user.id, login_url='/')
заранее спасибо за руководство.
Вы должны просто записать это как проверку в представлении:
@login_required(login_url='/users/login')
def my_submission(request,submission_id):
submission = Submission.objects.get(pk=submission_id)
if submission.user_id != request.user.pk:
return redirect('/')
return render(request, "assignments/mysubmission.html", {
"submission": submission
})
Update
Если вы будете использовать его много раз, подумайте о том, чтобы реализовать его как представление на основе класса, чтобы вы могли наследовать и использовать некоторые дополнительные возможности:
class UserIsOwnerMixin(AccessMixin):
"""Verify that the user the owner of related object."""
owner_id_field = 'user_id'
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated or getattr(self.get_object(), self.owner_field) != request.user.pk:
return self.handle_no_permission()
return super().dispatch(request, *args, **kwargs)
class SubmissionView(UserIsOwnerMixin, DetailView):
template = "assignments/mysubmission.html"
model = Submission
context_object_name = "submission"
login_url = '/users/login'