【问题标题】:404 on slug in django404 在 django 的 slug 上
【发布时间】:2018-07-06 10:03:44
【问题描述】:

我正在关注他们执行以下操作的教程:

<a href="{ % url 'films:add_comment' slug=film.slug %}">Leave a comment</a>

他们使用蛞蝓。我没有这样做,但一直在引用一个 ID。我认为对此很重要的代码部分是:

电影/urls.py:

from django.conf.urls import url
from django.urls import path
from . import views


    app_name = 'films'
    urlpatterns = [
        path('', views.index, name='index'),
        url(r'^films/<int:film_id>/comment/', views.add_comment, name='add_comment'),
        path('films/<int:film_id>/', views.detail, name='detail'),
    ]

电影/views.py

def add_comment(request, film_id):
    film = get_object_or_404(Film, pk=film_id)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit = False)
            comment.post = post
            comment.save()
            return redirect('film:detail',film)
    else:
        form = CommentForm()
        template = 'films/add_comment.html'
        context = {'form':form}
        return render (request,template,context)

mysite/urls.py:

urlpatterns = [
    url(r'^accounts/',include('accounts.urls')),
    url(r'^', include('films.urls')),
    url(r'^admin/', admin.site.urls),
]

add_comment.html:

{% extends 'base_layout.html' %}
{% block content %}

<div class="create-comment">
    <h2>Add Comment</h2>

</div>

{% endblock %}

如果我点击我创建的链接:&lt;a href="{ % url 'films:add_comment' film.id %}"&gt;Leave a comment&lt;/a&gt;

我明白了:

如果我手动将 url 更改为

http://127.0.0.1:8000/films/2/comment/

我明白了:

但看起来该列表中的 url 3 与我输入的内容匹配?

【问题讨论】:

  • 在您的 url 命名空间中,film 和 films 之间有区别吗?例如,我看到'films:add_comment' 和'film:detail'
  • 我的文件结构是films/templates/films/add_comment.html。如果我这样做 {{ film.title }} 它会显示单个电影的标题。
  • 应该是films:detail。修改了相同的 404 的立场。

标签: python django slug


【解决方案1】:

你离得很近。我认为只是一些小错误:

(最终工作编辑)

电影/urls.py

urlpatterns = [ 
   path('', views.index, name='index'), 
   path('<int:film_id>/comment', views.add_comment, name='add_comment'), 
   path('<int:film_id>', views.detail, name='detail'), 
]

mysite/urls.py

urlpatterns = [ 
   url('films/', include('films.urls')), 
   url('accounts/',include('accounts.urls')), 
   url('admin/', admin.site.urls), 
]

(锻炼)


电影/urls.py:

app_name = 'films'
urlpatterns = [
   url(r'^films/(?P<film_id>\d+)/comment/', views.add_comment, name='add_comment'),
]

注意:(?P&lt;film_id&gt;\d+) 这就是您捕获正确标识符的方式


这是不正确的:

&lt;a href="{ % url 'films:add_comment' film.id %}"&gt;Leave a comment&lt;/a&gt;

应该是:

&lt;a href="{% url 'films:add_comment' film_id=film.id %}"&gt;Leave a comment&lt;/a&gt;

  • 注意{%中没有空格
  • 我们现在使用我们在上面的 urls.py 中定义的标识符。

您的def add_comment(request, film_id): 让我有点困惑,但请试一试我的建议。然后评论发生的任何问题,我们会解决这个问题!


编辑:好的,下一个可能会阻碍你的小错误

urlpatterns = [
    path(r'^$', views.index, name='index'),
    path(r'^films/<int:film_id>/comment/$', views.add_comment, name='add_comment'),
    path(r'^films/<int:film_id>/$', views.detail, name='detail'),
]
  • 使所有第一个 arg 字符串为正则表达式字符串,即 'foo' -> r'foo'
  • 根据the v2 release notes,你需要使用path( )来使用你很酷的&lt;int:film_id&gt;语法。 url() 不会很伤心☹️
  • 以“$”结束正则表达式,表示字符串结束。防止将 films/2/comment 匹配到 films/2/

【讨论】:

  • 我同意这个答案,但我认为他捕获film_id 的方式现在在 Django 2 中有效
  • 我认为正在取得进展 :).... 我现在明白了:NoReverseMatch at /films/2/ Reverse for 'add_comment' with keyword arguments '{'film_id': 2}' not found. 1 pattern(s) tried: ['films/&lt;int:film_id&gt;/comment/']
  • 请您添加带有完整 urls.py 文件的编辑吗?
  • 当然,我已经添加了我现在拥有的所有内容。在截屏时,我也有结果和投票,但没有使用它们。
  • 不幸的是,我遇到了同样的 404 错误,但是根据最新的建议,我现在在每个页面上都得到了 404。
猜你喜欢
  • 2019-08-06
  • 2013-09-18
  • 2014-12-08
  • 2010-10-30
  • 2020-03-01
  • 2018-07-31
  • 1970-01-01
  • 2015-07-27
  • 2021-10-08
相关资源
最近更新 更多