如何在Django中使用通用RedirectView重定向到另一个url时跳过url中的pk?

cbwuti44  于 2023-01-31  发布在  Go
关注(0)|答案(2)|浏览(134)

我尝试在使用DetailView显示记录并再次重定向到列表页后删除该记录。

    • 查看. py**
...

class DailyRecordDeleteConformationView(RequiredBasicDetailsAndContextMixin, DetailView):
    model = DailyRecord
    obj_not_found_redirect = reverse_lazy('business:add_daily_records')
    template_name = 'business/daily_records_detail.html'
    context_object_name = 'record'

    def get_object(self):
        detail = self.model.custom_obj.get_single(self)
        return detail

class DailyRecordDeleteView(RequiredBasicDetailsMixin, RedirectView):
    pattern_name = 'business:daily_records'

    def get_redirect_url(self, *args, **kwargs):
        # Delete the record
        return super().get_redirect_url(*args, **kwargs)

...
    • 网址. py**
...
    path('daily-records/', DailyRecordView.as_view(), name='daily_records'),
    path('daily-records/<int:pk>/', DailyRecordDeleteConformationView.as_view(), name='daily_record_detail'),
    path('daily-records/<int:pk>/delete/', DailyRecordDeleteView.as_view(), name='daily_record_delete'),

...

在这里,我得到这个下面的错误时,点击详细信息视图上的删除按钮

NoReverseMatch at /business/daily-records/7/delete/

Reverse for 'daily_records' with keyword arguments '{'pk': 7}' not found. 1 pattern(s) tried: ['business/daily\\-records/\\Z']

我是基于类的视图的新手,仍然不能弄清楚如何重定向到没有pk参数的url。
我试图找到RedirectView的任何变量或可以跳过当前URL的pk而重定向到另一个URL的东西。
谢谢。

zzlelutf

zzlelutf1#

当你用**kwargs调用get_redirect_url时,你的pkkwargsRedirectView中,Django试图用kwargs获取你的url。
因此,如果您不想传递pk,就不要传递kawrgs

def get_redirect_url(self, *args, **kwargs):
    return super().get_redirect_url()
dl5txlt9

dl5txlt92#

您可以指定url而不是pattern_name,因此:

from django.urls import reverse_lazy

class DailyRecordDeleteView(RequiredBasicDetailsMixin, RedirectView):
    urls = reverse_lazy('business:daily_records')

    # no get_redirect_url

您的get_redirect_url也不应该删除记录:HTTP协议规定GET和OPTION应该是“安全的”方法,这意味着它们应该没有副作用。
因此,您应该使用POST/DELETE请求来删除记录。您可以使用一个小的FormView,它将在(空的)表单有效的情况下处理这个问题,因此可以重写form_valid方法。

相关问题