我是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'