404在django上的slu ..

时间:2018-01-27 02:17:59

标签: python django slug

我正在按照教程执行以下操作:

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

他们使用slu ..我没有这样做,但一直在引用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 %}

如果点击我制作的链接:<a href="{ % url 'films:add_comment' film.id %}">Leave a comment</a>

我明白了: enter image description here

如果我手动将网址更改为

  

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

我明白了:

enter image description here

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

1 个答案:

答案 0 :(得分:2)

你是如此亲密。我相信只是一些小错误:

(最终工作编辑)

膜/ 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<film_id>\d+)了解如何捕获正确的标识符

这是不正确的:

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

应该是:

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

  • 请注意{%
  • 没有差距
  • 我们现在使用上面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' - &gt; r'foo'
  • 根据the v2 release notes,您需要使用path( )来使用酷<int:film_id>语法。 url()不会伤心地☹️
  • 使用&#39; $&#39;结束你的正则表达式,这意味着字符串结束。阻止将films/2/commentfilms/2/
  • 匹配