NoReverseMatch в посте, когда я добавляю ссылку href
Я создаю "игровой" веб-сайт, где даются подсказки, а люди делают предположения.
Я добавил home.html, new_game.html, game_detail.html, base.html, и теперь edit_game.html. Все работает правильно для создания новой игры, списка (в home.html) и отображения подробностей. Теперь я добавляю функцию для редактирования игры в edit_game.html.
Когда я добавляю html-ссылку `Edit Game в game_detail.html, я получаю ошибку (ниже), когда я нажимаю на любую из игр в списке, которая должна отображать страницу game_detail. Другими словами, он не отображает страницу game_detail.html. Вот ошибка:
NoReverseMatch at /post/2/
Reverse for 'edit_game' with arguments '('',)' not found. 1 pattern(s) tried: ['post/(?P<pk>[0-9]+)/edit/$']
Очевидно, что передается ID сообщения. Но он не перехватывает "/edit/". Вот код подробной страницы:
<!-- templates/game_detail.html -->
{% extends 'base.html' %}
{% block content %}
<div class="post-entry">
<h2>{{object.title}}</h2>
<p>{{ object.body }}</p>
</div>
<a href="{% url 'edit_game' post.pk %}">Edit Game</a>
{% endblock content %}
Вот код урлов:
from django.urls import path
from .views import (
GameListView,
GameDetailView,
GameCreateView,
GameUpdateView,
)
urlpatterns = [
path('post/<int:pk>/edit/', GameUpdateView.as_view(), name='edit_game'),
path('post/<int:pk>/', GameDetailView.as_view(), name='game_detail'),
path('post/new/', GameCreateView.as_view(), name='new_game'),
path('', GameListView.as_view(), name='home'),
]
Код представления:
from django.views.generic import ListView, DetailView
from django.views.generic.edit import CreateView, UpdateView
from .models import Game
class GameListView(ListView):
model = Game
template_name = 'home.html'
class GameDetailView(DetailView):
model = Game
template_name = 'game_detail.html'
class GameCreateView(CreateView):
model = Game
template_name = 'new_game.html'
fields = ['title', 'author', 'body']
class GameUpdateView(UpdateView):
model = Game
template_name = 'edit_game.html'
fields = ['title', 'body']
Объект передается как object
и game
в шаблон, таким образом, вы можете построить ссылку с:
{% url 'edit_game' game.pk %}
или:
{% url 'edit_game' object.pk %}
Виллем,
Просто для развлечения, я попробовал следующее, что работает:
<!-- templates/game_detail.html -->
{% extends 'base.html' %}
{% block content %}
<div class="post-entry">
<h2>{{game.title}}</h2>
<p>{{ object.body }}</p>
</div>
<a href="{% url 'edit_game' game.pk %}">Edit Game</a>
{% endblock content %}
Но я новичок в Django и немного новичок в Python. Идет ли игра (в нижнем регистре) от
class GameUpdateView(UpdateView):
model = Game
?