当 url 模式与模型名称相同时,Django 管理员加载视图模板

Django admin loads view template when url pattern is same as model name

我正在 Django 2.0 中编写我的第一个 Django 项目。

我注意到 Django urlpatterns 的另一个奇怪行为。

我有一个应用程序 starrednotes,其中的模型为 Starred(models.Model)

sharednotes app

中的 Shared(models.Model) 也是如此

我已经为 urlpattern 配置了与模型名称相同的路径模式

urlpatterns = [
    url(r'^starred/$', StarredNotes.as_view(), name='starred'),
    url(r'^shared/$', SharedNotes.as_view(), name='shared'),
]

并且视图 StarredNotes

class StarredNotes(ListView):
    template_name = 'notes/starred.html'
    model = Starred
    context_object_name = 'starred_notes'

    def get_queryset(self):
        starred_notes = Starred.objects.filter(user=self.request.user)
        return starred_notes

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        return super(self.__class__, self).dispatch(request, *args, **kwargs)

上面的 URL 设置可以使用

访问
http://example.com/notes/shared
http://example.com/notes/starred

但是当我从 admin 使用 URL 作为

访问这两个模型时
http://example.com/admin/sharednotes/shared
http://example.com/admin/starrednotes/starred

这两个链接正在 StarredNotesSharedNotes class 中加载模板设置,而不是管理模板。

我不明白为什么会这样。是Django的限制还是Django的BUG呢

无论如何,这里有两种方法可以摆脱它。

1.更改 urlpattern

更改URL 模式并将模式替换为模型名称以外的内容。 就我而言,这就是我的 urlpatterns 现在的样子。

urlpatterns = [
    url(r'^starred/$', StarredNotes.as_view(), name='starred'),
    url(r'^shared/$', SharedNotes.as_view(), name='shared'),
]

2。更改模型名称

这不是推荐的方法,但只有当 urlpattern 比模型更重要时,您才可以将模型重命名为其他名称。 更改模型名称可能还需要更改许多其他地方。

class SharedNote(models.Model):
    # model fields

class StarredNote(models.Model):
    # model fields