<int:pk>/ 在我的 Django 新版本项目中由于某种原因不起作用



我是Django的新手,正在尝试创建一个基本项目。我目前被困在int:pk/,由于某种原因,我无法将详细信息页面链接到学校列表页面。请帮忙!非常感谢!以下是代码:在我的urls.py文件中:

app_name = 'basic_app'
urlpatterns = [
path('list/',views.SchoolListView.as_view(), name='list'),
path('<int:pk>/',views.SchoolDetailView.as_view(), name='detail'),
path('create/',views.SchoolCreateView.as_view(),name='create'),
path('update/<int:pk>/', views.SchoolUpdateView.as_view(),name='update')

]

在我看来.py:

class IndexView(TemplateView):
template_name = 'index.html'
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['injectme'] = 'Basic injection'
return context
class SchoolListView(ListView):
model = models.School
class SchoolDetailView(DetailView):
context_object_name = 'school_detail'
model = models.School
query_pk_and_slug=True
def get(self, request, *args, **kwargs):
return render(request,'basic_app/school_detail.html')
class SchoolUpdateView(UpdateView):
fields = ('name','principal')
model = models.School

在模板school_list.html中:

{% for school in school_list %}
<h2><li><a href="{{ school.id }}">{{school.name}}</a></li></h2>
{% endfor %}

在模板school.detail.html中:

<div class="container">
<p><a class='btn btn-warning' href="{% url 'basic_app:update' pk=school_detail.pk %}">Update here</a></p>

在模型中.py:

from django.db import models
from django.urls import reverse
class School(models.Model):
name = models.CharField(max_length=200)
principal = models.CharField(max_length=200)
location = models.CharField(max_length=200)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("basic_app:detail",kwargs={'pk':self.pk})
class Student(models.Model):
name = models.CharField(max_length=200)
age = models.PositiveIntegerField()
school = models.ForeignKey(School,related_name='students',on_delete=models.CASCADE)

这就是我得到的错误:

NoReverseMatch at /basic_app/1/
Reverse for 'update' with keyword arguments '{'pk': 
''}' not found. 1 pattern(s) tried: 
['basic_app/update/(?P<pk>[0-9]+)/$']
Request Method: GET
Request URL:    http://127.0.0.1:8000/basic_app/1/
Django Version: 3.0.3
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'update' with keyword arguments '{'pk': 
''}' not found. 1 pattern(s) tried: 
['basic_app/update/(?P<pk>[0-9]+)/$']
Exception Location:  
C:UsersMyPCAnaconda3envsMydjangoEnvlibsite- 
packagesdjangourlsresolvers.py in 

_reverse_with_prix,第677行Python可执行文件:
C:\Users\MyPC/Anaconda3\envs\MydjangoEnv\Python.exePython版本:3.8.3Python路径:[C:\Users\MyPC\MyDjango\advanced_section\ad_project',

您需要更改详细视图

class SchoolDetailView(DetailView):
context_object_name = 'school'
model = models.School
template_name ='basic_app/school_detail.html'

而且这里已经定义了absolute_url,所以在模板中可以这样做。

{% for school in school_list %}
<h2><li><a href="{{ school.get_absolute_url}}">{{school.name}}</a></li></h2>
{% endfor %}

编辑:更新视图中的默认上下文名称设置为object,因此将其更改为school_detail

class SchoolUpdateView(UpdateView):
fields = ('name','principal')
model = models.School
context_object_name='school_detail'

最新更新