【问题标题】:Combine DRF router with django urlpattern将 DRF 路由器与 django urlpattern 结合使用
【发布时间】:2018-04-26 13:44:17
【问题描述】:

如何使用app_name = 'scrumboard' 将 django urlpatterns 与 DRF 路由器结合在一起?我尝试了DRF documentation 中的所有方法,但仍然无法解决此问题。到目前为止,我有以下 urls.py 文件:

#scrumboard/urls.py

from rest_framework.routers import DefaultRouter
from .api import ListViewSet, CardViewSet
from django.urls import re_path, path, include
from . import views

router = DefaultRouter()
router.register(r'lists', ListViewSet)
router.register(r'cards', CardViewSet)

app_name = 'scrumboard'
urlpatterns = [
    path('', views.index, name="index"),
    re_path(r'^api/', include((router.urls))),
]

这是我的项目 urls.py:

#project/urls.py

from django.contrib import admin
from django.urls import include, path, re_path
#Add URL maps to redirect the test URL to our application
from django.views.generic import RedirectView
# Use static() to add url mapping to serve static files during development (only)
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', include('home.urls')),
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')),
    path('test/', RedirectView.as_view(url='/catalog/', permanent=True)),
    path('polls/', include('polls.urls')),
    path('blog/', include('blog.urls')),
    path('catalog/', include('catalog.urls')),
    path('scrumboard/', include('scrumboard.urls'))
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

在我的模板中,我将有机会像这样定义动态 url:

<li><a href="{% url 'scrumboard:index' %}">Scrumboard</a></li>

这将带我进入我的 Scrumboard 应用程序。

当我转到这个 url localhost:8000/scrumboard/ 时,使用上面的代码,我得到一个错误

更新

当我转到 localhost:8000/scrumboard/api 时,它运行良好

更新

完整回溯http://dpaste.com/07QR05W

更新

添加项目 urls.py 代码

【问题讨论】:

  • /scrumboard/ 是否应该触发 index 视图?
  • 您是否尝试在常规视图路径之前放置路由器路由,并且 urlpath re_path(r'^', include((router.urls))), 为空?
  • 是的。我已经定义了在 scrumboard/index.html 下呈现模板的索引函数

标签: django django-rest-framework


【解决方案1】:

我只是想删除这个问题,但我想也许其他人会反对这个并决定描述问题的真正原因。

因为经验不足,找错地方了。

通过主页模板上的链接:

<li><a href="{% url 'scrumboard:index' %}">Scrumboard</a></li>

#scrumboard/urls.py

from django.urls import re_path, path, include
from . import views

app_name = 'scrumboard'
urlpatterns = [
    path('', views.index, name="index"),
]

我们运行了一个在 view.py 中定义的函数,它接受这个请求并在 scrumboard/index.html 下呈现模板

#scrumboard/views.py

def index(request):
    return render(request, 'scrumboard/index.html', {})

这里是错误的。

Exception Type: NoReverseMatch at /scrumboard/
Exception Value: Reverse for 'lists' not found. 'lists' is not a valid view function or pattern name.

我使用了 django Reversing namespaced URLs,因为我有几个应用程序,每个应用程序都有自己的 index.html 模板。我不得不猜测问题出在这个模板的某个地方:

{% extends 'base.html' %}
{% load static %}


{% block title %}
    <title>Scrumboard</title>
{% endblock %}
{% block extracss %}
    <link rel="stylesheet" href="{% static 'scrumboard/css/main.css' %}" />
{% endblock %}

{% block content %}
        <a href="{% url 'scrumboard:lists' %}" target="_blank" class="top-menu">Lists</a><br>
        <a href="{% url 'scrumboard:cards' %}" target="_blank" class="top-menu">Cards</a>
        <hr>
          <div ng-app="scrumboard.demo">
            {% verbatim %}
            <div ng-controller="ScrumboardController">
              <div ng-repeat="list in data">
                <h3>{{list.name}}</h3>
                <ul>
                  <li ng-repeat="card in list.cards">{{card.title}}</li>
                </ul>
                <div class="input-group">
                  <input type="text" ng-model="new_title">
                  <button class="btn btn-outline-secondary" ng-click="add(list, new_title)">+</button>
                </div>
              </div>
            </div>
            {% endverbatim %}
              <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
              <script type="text/javascript" src="{% static 'scrumboard/js/scrumboard.js' %}"></script>
          </div>
{% endblock %}

看到这几行,我想问题大概出在这个:

<a href="{% url 'scrumboard:lists' %}" target="_blank" class="top-menu">Lists</a><br>
<a href="{% url 'scrumboard:cards' %}" target="_blank" class="top-menu">Cards</a>

我决定只评论他们。并且认为问题解决后,我重新加载了页面,但错误仍然再次飞出。

<!-- <a href="{% url 'scrumboard:lists' %}" target="_blank" class="top-menu">Lists</a><br>
<a href="{% url 'scrumboard:cards' %}" target="_blank" class="top-menu">Cards</a> -->

但是 django 忽略了通常的 html cmets 并尝试阅读注释代码。所以我的错误并没有消失,我开始在别处寻找问题。 由于缺乏经验,我问了一个不正确的问题。 只需删除此行即可解决我的问题。

【讨论】:

    【解决方案2】:

    我们如何期望/scrumboard/ 匹配第一个正则表达式?是否有包含您提到的文件的外部 urls.py 文件?

    在没有更多信息的情况下,这行得通吗?

    urlpatterns = [
        path('^scrumboard/?$', views.index, name="index"),
        re_path(r'^api/', include((router.urls))),
    ]
    

    【讨论】:

      猜你喜欢
      • 2017-02-13
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2023-03-13
      • 2015-09-21
      • 2017-01-03
      • 2014-08-01
      相关资源
      最近更新 更多