首页 > 解决方案 > 继承类的顺序在 Python 中很重要吗?

问题描述

在创建或编辑表单上点击提交后,我在我的 django 应用程序中遇到了这个错误: No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model..

这很令人困惑,因为我有一个get_success_url通过继承传递下来。需要明确的是,我发现了这个问题,但不知道为什么我的解决方案有效。

这是导致内部错误的代码 .../views.py

class FormViews():
    model = Ticket
    form_class = TicketForm

    def get_success_url(self):
        return reverse('tickets:index')

class TicketCreate(CreateView, FormViews):
    template_name = 'tickets/ticket_create_form.html'
    model = Ticket
    form_class = TicketForm

class TicketUpdate(UpdateView, FormViews):
    model = Ticket 
    form_class = TicketForm
    template_name_suffix = '_update_form'

我创建了FormViews类,因此模型form_classget_success_url不会有任何重复的代码。

我可以通过切换函数定义中的参数来解决此错误:

class TicketCreate(CreateView, FormViews)变成了class TicketCreate(FormViews, CreateView)

class TicketUpdate(UpdateView, FormViews)变成了class TicketUpdate(FormViews, UpdateView)

这解决了它。现在我重定向到索引页面没有任何问题。为什么切换列出的父类后get_success_url被识别?我会认为属性和函数是由 Django 继承和识别的,无论顺序如何。这是 Python 或 Django 相关的问题吗?

标签: pythondjangoinheritance

解决方案


在 python 中,每个类都有一个称为 MRO(方法解析顺序)的东西,很好地解释了它。您的FormViews(python 中的大多数类也是单数的)更像是一个 mixin,我会这样称呼它:FormViewMixin.

由于CreateViewUpdateView是已get_success_url定义的正确类,因此顺序绝对重要。所以我会把你想要“发现”的东西放在第一位。

class TicketCreateView(FormViewMixin, CreateView):
    ...

是你想要的。


推荐阅读