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

<int:pk>/ in my Django new version project doesn't work for some reason

我是 Django 的新手,正在尝试创建一个基本项目。我目前停留在 int:pk/ 并且由于某种原因我无法 link 详细信息页面到学校列表页面。请帮忙!多谢!下面是代码: 在我的 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')

]

在我的 views.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>

在models.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:\Users\MyPC\Anaconda3\envs\MydjangoEnv\lib\site- 
packages\django\urls\resolvers.py in 

_reverse_with_prefix,第 677 行 Python 可执行文件:
C:\Users\MyPC\Anaconda3\envs\MydjangoEnv\python.exe Python版本:3.8.3 Python路径: ['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'