如何在Django中使用URL参数在dispatch方法中设置重定向URL

55ooxyrt  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(192)

我有一个自定义Mixin,它可以检查特定服务的总使用量,并允许用户提交表单或重定向到success_url,并显示总使用量的错误消息。这对于没有任何动态参数(如pk或slug)的URL很有效。但是使用参数,Django无法找到URL模式来重定向到success_url。
urls.py (URL应用程序的www.example.com文件)

# some other urls
path('<int:post_id>/image/stock/', InstagramImageStockView.as_view() , name='instagram_image_stock'),
path('<int:post_id>/image/stock/generate/', InstagramGenerateStockImageView.as_view(), name='instagram_fetch_stock_image'),
# more URLs

views.py

class InstagramGenerateStockImageView(CustomMixin, FormView):
    form_class = InstagramStockImageForm
    success_url = 'instagram:instagram_image_stock'

    # other code

自定义混合

class CustomMixin:
    # other methods
    def check_generation_status_and_redirect(self, request, *args, **kwargs):
        if self.able_to_generate:
            return super().dispatch(request, *args, **kwargs)
        else:
            # Set an error message based on conditions.
            return redirect(self.success_url, kwargs=kwargs)

    def dispatch(self, request, *args, **kwargs):
        self.check_daily_count()
        return self.check_generation_status_and_redirect(request, *args, **kwargs)

当用户达到限制时,我在重定向到success_url时收到NoReverseMatch错误。

我也尝试用reverse_lazy定义success_url,但没有成功。
谢谢。

dzhpxtsq

dzhpxtsq1#

对于关键字参数,redirect的工作方式与reverse不同。而不是kwargs参数,您应该通过redirect函数解包直接传递kwargs,如下所示:

def check_generation_status_and_redirect(self, request, *args, **kwargs):
    if self.able_to_generate:
        return super().dispatch(request, *args, **kwargs)
    else:
        # Set an error message based on conditions.
        return redirect(self.success_url, **kwargs)  #<-- Here

有关详细信息,请参阅有关redirect的文档。

相关问题