django url路由到同一视图,有时带kwargs,有时不带

5hcedyr0  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(111)

我的应用程序中有多个工具(大约20个)。可以使用已选定的对象或不连接到对象的情况下访问每个对象。目前我正在使用这样的:

urlpatterns = [
    path('tool_one/', views.ToolOneView.as_view(), name='tool-one'),
    path('<int:id>/tool_one/', views.ToolOneView.as_view(), name='tool-one'),

    # [... 18 more paths ...]

    path('tool_twenty/', views.ToolTwentyView.as_view(), name='tool-twenty'),
    path('<int:id>/tool_twenty/', views.ToolTwentyView.as_view(), name='tool-twenty')
]

现在我可以通过两种方式链接到我的工具:

<a href="{% url 'tools:tool-one' id=object.id %}">
  Option A: Tool one with object attached
</a>
<!--or-->
<a href="{% url 'tools:tool-one' %}">
  Option B: Tool one without object attached
</a>

如果我总是使用选项A,但允许object.id的值为None,这对我来说会容易得多。在object.id = None的情况下,它应该引导用户查看没有附加对象的视图。
对于我目前的方法,我不喜欢urlpatterns和模板中的重复性。示例:我有一个导航栏链接到所有工具,但没有附加对象。在我的ObjectDetailView上,我已经链接到所有附带对象的工具。它基本上是相同的代码片段,理论上我可以重用它,但显然不能,因为对于后者,我必须添加id=object.id %}
这应该很容易做到,因为用例可能经常发生,所以请启发我!

bbmckpt7

bbmckpt71#

使用id=0表示没有对象。你不需要两个URL。如果kwargid =0,则只需要不尝试获取对象的代码。我假设id是Django的默认主键。它们总是正整数。
如果CBV使用SingleObjectMixin get_object方法来获取对象,则可以将其子类化以处理零:

def get_object(self):
    if self.kwargs['id'] == '0':
        self.object = None
        return
    return super().get_object()

根据视图tool_one到tool_twenty的相似性,您也可以使用单个URL和视图

path('<int:id>/<str:tool_id>/', views.ToolAny.as_view(), name='tool-any'),

检查kwarg tool_id是否在视图的早期有效,如果不是,则返回Http404。在中,使用它分派到正确的处理。

相关问题