Как передать параметр метода представления пользователю при прохождении теста в 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'
    
    
Вернуться на верх