Django 视图没有正确重定向

Django view not redirecting properly

需要一些帮助将其重定向回我所在的页面,它用于类似于页面上的“赞”的按钮点击。

class ProjectDelayedView(RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        slug = self.kwargs.get("slug")
        print(slug)
        obj = get_object_or_404(Project, slug=slug)
        if obj.delayed is False:
            obj.delayed = True
        else:
            obj.delayed = False
        obj.save()
        return 'http://127.0.0.1:8000/si/list/All/'

我已将此重定向到 google,因为我不太清楚如何将它重定向到我网站上的页面。这也是我的 url 页面:

rom django.urls import path

from project_portal.views import (
    ProjectCreateView,
    ProjectDelayedView,
    ProjectListView,
    project_update_view,
    search,
)

urlpatterns = [
    path('project-create/', ProjectCreateView.as_view(), name='project-create'),
    path('<slug:slug>/delayed/', ProjectDelayedView.as_view(), name='project-delay'),
    path('list/<area>/', ProjectListView.as_view(), name='project-list'),
    path('<slug:slug>/update/', project_update_view, name='project-update'),
    path('search/', search, name='search'),
]

我遵循的教程是说使用 get_absolute_url,但我不确定它是如何工作的,而且在文档中尝试理解它很棘手,我假设 get_absolute_url 可能在模型中设置了一个硬编码的 url。除此之外,最终,这将重定向到 DetailView,该按钮将位于该位置。

更新:我现在已经开始工作了,但是如您所见,get_redirect_url() 中的 return 只是硬编码的,这只是为了让视图工作,我可以在文档中找不到任何关于应该 returned 的内容,但是硬编码的 url 不是很有用。

尝试这样的事情:

在您的项目模型中插入一个 get_absolute_url 方法

    def get_absolute_url(self):
        from django.urls import reverse
        return reverse('project-detail', args=[self.slug])

像这样的详细视图:

class ProjectDetailView(DetailView):
    model = Project

path('project/<slug:slug>/', views.ProjectDetailView.as_view(), name='project-detail'),

最后在您的重定向视图中

class ProjectDelayedView(RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        slug = self.kwargs.get("slug")
        print(slug)
        obj = get_object_or_404(Project, slug=slug)
        if obj.delayed is False:
            obj.delayed = True
        else:
           obj.delayed = False
        obj.save()
        return obj.get_absolute_url()