Django - Перенаправление неаутентифицированного пользователя, пытающегося получить доступ к UpdateView, на DetailView

Это моя последняя клетка мозга говорит.
У меня есть модель под названием Post с полями title, body, author, logo и pub_date.
В моем приложении есть страница, на которой пользователь может обновить/редактировать пост. Я хочу, чтобы пользователь был перенаправлен на страницу подробностей Post's Detail page, если он попытается получить доступ к ней, не будучи зарегистрированным.
Проблема в том, что я не могу сослаться на Post's pk для перенаправления пользователя на соответствующую страницу, Если сказать проще:
пользователь, пытающийся получить доступ к .../2/edit/, будет перенаправлен на .../2/, если он не вошел в систему

. Я пробовал использовать LoginRequiredMixin для блокировки пользователя, но я не могу перенаправить пользователя на страницу относительных данных.

urls.py:

urlpatterns = [
    path('', PostListView.as_view(), name='index'),
    path('<int:pk>/', PostDetailView.as_view(), name='details'),
    path('new/', PostCreateView.as_view(), name='new_post'),
    path('<int:pk>/edit', PostUpdateView.as_view(), name='update_post'),
]

views.py:

class PostUpdateView(LoginRequiredMixin, UpdateView):
    model = Post
    login_url = reverse_lazy('details', args=[self.object.pk,]) 
    form_class = PostUpdateForm
    template_name = "posts/update_post.html"

Я также пробовал:

class PostUpdateView(LoginRequiredMixin, UpdateView):
    def get_login_url(self) -> str:
        super().get_login_url()
        UpdateView.get(self, self.request)
        self.login_url = reverse_lazy('details', args=[self.object.pk,])
    model = Post
    form_class = PostUpdateForm
    template_name = "posts/update_post.html"

Но он возвращает значение empty/none

Является ли LoginRequiredMixin вообще правильным способом сделать это?
Я знаю, что этого можно легко достичь без GenericViews/UpdateView, просто получив запрос и обработав его самостоятельно, Но разве GenericViews не предназначен для того, чтобы сделать работу проще?

Я не знаю, как называется поле user в вашей модели Post. Я предполагаю, что это автор.

class PostUpdateView(LoginRequiredMixin, UpdateView):
    model = Post
    login_url = reverse_lazy('details', args=[self.object.pk,]) 
    form_class = PostUpdateForm
    template_name = "posts/update_post.html"

    def dispatch(self, request, *args, **kwargs):
        obj = self.get_object()
        if request.user.is_authenticated:
            if obj.author != self.request.user:
                return redirect(obj)
            return super(UpdateStory, self).dispatch(request, *args, **kwargs)
        else:
            return redirect(obj)


    def get_success_url(self, **kwargs):         
        if  kwargs != None:
            return reverse_lazy('details', kwargs = {'pk': kwargs['idnumber']})
        else:
            return reverse_lazy('details', args = (self.object.id,))
class PostUpdateView(LoginRequiredMixin, UpdateView):
    model = Post
    form_class = PostUpdateForm
    template_name = "posts/update_post.html"
    def get_login_url(self) -> str:
         return reverse_lazy('details', args=[self.object.pk,])

U нужно вернуть URL

Пробовали ли вы включать

from django.contrib.auth.decorators import login_required

а затем просто поместить этот декоратор над вашим классом:

@login_required 

так что это что-то вроде этого


@login_required 
class PostUpdateView(UpdateView):
    model = Post
    login_url = reverse_lazy('details', args=[self.object.pk,]) 
    form_class = PostUpdateForm
    template_name = "posts/update_post.html"

Вернуться на верх