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