python - 继承类的顺序在 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_class和get_success_url不会有任何重复的代码。
我可以通过切换函数定义中的参数来解决此错误:
class TicketCreate(CreateView, FormViews)
变成了class TicketCreate(FormViews, CreateView)
class TicketUpdate(UpdateView, FormViews)
变成了class TicketUpdate(FormViews, UpdateView)
这解决了它。现在我重定向到索引页面没有任何问题。为什么切换列出的父类后get_success_url被识别?我会认为属性和函数是由 Django 继承和识别的,无论顺序如何。这是 Python 或 Django 相关的问题吗?
解决方案
在 python 中,每个类都有一个称为 MRO(方法解析顺序)的东西,这很好地解释了它。您的FormViews
(python 中的大多数类也是单数的)更像是一个 mixin,我会这样称呼它:FormViewMixin
.
由于CreateView
和UpdateView
是已get_success_url
定义的正确类,因此顺序绝对重要。所以我会把你想要“发现”的东西放在第一位。
class TicketCreateView(FormViewMixin, CreateView):
...
是你想要的。
推荐阅读
- reactjs - 构建连接到 Contentful CMS 的 Gatsby 博客
- r - 将 R 连接到 Vertica DB 以进行数据转换和建模?
- r - 将 XGBoost eval_metric 交叉验证计算与权重匹配
- javascript - cors 污染图像上的映射颜色转换
- python - 需要帮助使用带括号的字符串
- keycloak - 是否可以从 Keycloak 中检索 AUTH_SESSION_ID cookie?
- r - Anova 测试 - 具有两个因素比较的单独组
- ibm-cloud - 上传后 bluemix 应用程序推送挂起
- ios - 使用 PinLayout 制作网格视图
- python - 组合 2 个列表,每次 n 个元素