django 中的 slug 404
404 on slug in django
我正在学习他们做这样的事情的教程:
<a href="{ % url 'films:add_comment' slug=film.slug %}">Leave a comment</a>
他们用鼻涕虫。我没有这样做,但一直在引用一个 ID。我认为对此很重要的代码部分是:
films/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'),
]
films/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 %}
如果我点击 link 我制作的是:<a href="{ % url 'films:add_comment' film.id %}">Leave a comment</a>
我明白了:
如果我手动将 url 更改为
我明白了:
但看起来 url 列表中的 3 与我输入的匹配?
你是如此亲密。我认为只是一些小错误:
(最终工作编辑)
films/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),
]
(锻炼)
films/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'
-> r'foo'
- 根据 the v2 release notes,您需要使用
path( )
才能使用您酷炫的 <int:film_id>
语法。 url()
不会伤心的做吧☹️
- 以“$”结束你的正则表达式,这意味着字符串结束。防止匹配
films/2/comment
到 films/2/
我正在学习他们做这样的事情的教程:
<a href="{ % url 'films:add_comment' slug=film.slug %}">Leave a comment</a>
他们用鼻涕虫。我没有这样做,但一直在引用一个 ID。我认为对此很重要的代码部分是:
films/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'),
]
films/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 %}
如果我点击 link 我制作的是:<a href="{ % url 'films:add_comment' film.id %}">Leave a comment</a>
我明白了:
如果我手动将 url 更改为
我明白了:
但看起来 url 列表中的 3 与我输入的匹配?
你是如此亲密。我认为只是一些小错误:
(最终工作编辑)
films/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),
]
(锻炼)
films/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'
->r'foo'
- 根据 the v2 release notes,您需要使用
path( )
才能使用您酷炫的<int:film_id>
语法。url()
不会伤心的做吧☹️ - 以“$”结束你的正则表达式,这意味着字符串结束。防止匹配
films/2/comment
到films/2/