我的应用程序中有多个工具(大约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
和模板中的重复性。示例:我有一个导航栏链接到所有工具,但没有附加对象。在我的Object
的DetailView
上,我已经链接到所有附带对象的工具。它基本上是相同的代码片段,理论上我可以重用它,但显然不能,因为对于后者,我必须添加id=object.id %}
这应该很容易做到,因为用例可能经常发生,所以请启发我!
1条答案
按热度按时间bbmckpt71#
使用id=0表示没有对象。你不需要两个URL。如果kwargid =0,则只需要不尝试获取对象的代码。我假设id是Django的默认主键。它们总是正整数。
如果CBV使用SingleObjectMixin get_object方法来获取对象,则可以将其子类化以处理零:
根据视图tool_one到tool_twenty的相似性,您也可以使用单个URL和视图
检查kwarg tool_id是否在视图的早期有效,如果不是,则返回Http404。在中,使用它分派到正确的处理。