【问题标题】:Django: Reverse not found. 'teachers_detail' is not a valid view function or pattern nameDjango:找不到反向。 “teachers_detail”不是有效的视图函数或模式名称
【发布时间】:2021-07-18 15:20:09
【问题描述】:

我是 django 的新手。我正在使用本教程https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views,但无法正确处理我的应用程序。 我在我的“edusys”项目中创建了一个应用程序“教育”。我正在尝试从数据库中获取教师列表并转到每个教师的页面,在那里我将能够从数据库中查看他们的信息。

当我使用“runserver”时出现下一个错误:

Reverse for 'teachers_detail' not found. 'teachers_detail' is not a valid view function or pattern name.

我做错了什么?我自己无法解决问题,在谷歌中找不到正确的答案。

我的这个项目的文件是这样的:

education/models.py:

from django.db import models
from django.urls import reverse

class Teachers(models.Model):
    tcode = models.CharField(max_length=10, primary_key=True)
    last_name = models.CharField(max_length=20)
    first_name = models.CharField(max_length=30)
    middle_name = models.CharField(max_length=20, null=True, blank=True)
    department_s = models.ForeignKey('Departments', on_delete=models.SET_NULL, null=True)
    employee_post = models.CharField(max_length=20)
    academic_degree = models.CharField(max_length=40)
    email = models.EmailField(max_length=50)

    GENDER_UNIT = (
        ('m', 'Мужчина'),
        ('f', 'Женщина'),
    )

    gender = models.CharField(max_length=1, choices=GENDER_UNIT)

    class Meta:
        ordering = ['last_name']

    def __str__(self):
        return '%s %s %s' % (self.last_name, self.first_name, self.middle_name)

    def get_absolute_url(self):
        return reverse("teachers_detail", args=[str(self.tcode)])

教育/urls.py:

from django.urls 导入路径 从 。导入视图 从 django.conf.urls 导入 url

app_name = 'education'

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^teachers/$', views.TeachersListView.as_view(), name='teachers'),
    #url(r'^teachers/(?P<pk>\d+)$', views.TeachersDetailView.as_view(), name='teachers_detail'),
    url(r'^teachers/<int:pk>$', views.TeachersDetailView.as_view(), name='teachers_detail'),
]

education/views.py:

from django.shortcuts import render
from django.http import HttpResponse
from .models import Teachers
from django.views import generic

def teachers_detail(request, pk):
    context = dict()
    return render(request, 'education/teachers_detail.html', context)

class TeachersListView(generic.ListView):
    model = Teachers
    paginate_by = 10
    context_object_name = 'teachers_list' 
    template_name = 'education/teachers_list.html'


class TeachersDetailView(generic.DetailView):
    model = Teachers
    #book_id=Teachers.objects.get(pk=Teachers.tcode)

教育/teachers_list.html:

{% extends "base_generic.html" %}

{% block content %}
<div class="container"><div class="col-12"><h1>Teachers list</h1></div></div>
<div class="container">
  
  {% if teachers_list %}
  
      <table class="table">
        <tbody>
          
          {% for Teachers in teachers_list %}
            <tr>
              <th scope="row"></th>
                <td><a href="{{ Teachers.get_absolute_url }}">{{ Teachers.last_name }} {{ Teachers.first_name }} {{ Teachers.middle_name|default_if_none:"" }}</a> ({{Teachers.department_s}})</td>
              <th scope="row"></th>
                <td>{{ Teachers.email }}</a></td>
              <th scope="row"></th>
                <td><a href="profile.html" class="btn btn-primary" role="button">Профиль</a></td>
            </tr>
          {% endfor %}
        
        </tbody>
      </table>
    
  {% else %}
    <p>list is empty.</p>
  {% endif %}
</div> 
{% endblock %}

教育/teachers_detail.html:

{% extends "base_generic.html" %}

{% block content %}
  <h1>{{ Teachers.last_name }} {{ Teachers.first_name }} {{ Teachers.middle_name }}</h1>

  <p><strong>email:</strong> {{ Teachers.email }}</a></p>
  <p><strong>department:</strong> {{ Teachers.department_s }}</a></p>
  <p><strong>employee post:</strong> {{ Teachers.employee_post }}</a></p>
  <p><strong>academic dehree:</strong> {{ Teachers.academic_degree }}</a></p>

{% endblock %}

【问题讨论】:

  • 从错误页面上的 URI /system/teachers/ 来看,我假设 education.urls 包含在不同的 urls.py 中?如果 include() 有命名空间参数,那么 reverse('teachers_detail') 将缺少其命名空间组件。
  • @elyas 你是什么意思?我不确定我是否理解你所说的
  • 这行path('/system/', include('education.urls')) 是否在您项目中某个不同的 urls.py 文件(不是education/urls.py)中?如果有,有namespace吗?
  • @elyas 是的,看起来你说的是:path('system/', include('education.urls'))
  • 您可能会混合使用新旧 URL 定义。在您的 urls.py 中尝试 from django.urls import pathpath('teachers/&lt;int:pk&gt;', views.TeachersDetailView.as_view(), name='teachers_detail'),

标签: python django django-models django-views


【解决方案1】:

根据 urls 和 models.py 文件,问题在于 get_absolute_url 方法,因为当您在 get_absolute_url 中提供 args 时,url 需要一个名为 pk 的关键字参数 ie.args=[str(self.tcode)]。请改成如下。

更新了一个:

def get_absolute_url(self):
        return reverse("teachers_detail",kwargs = {'pk': self.tcode })

旧的:

def get_absolute_url(self):
    return reverse("teachers_detail", args=[str(self.tcode)])

注意:另外,根据 ulrs.py,pk 应该是一个整数值,而根据模型,tcode 是主键,它是一个 char 字段,您可以使用正确的字段类型或更新 url 关键字参数。我的意思是两者应该同步以避免任何显式类型转换。

url(r'^teachers/<int:pk>$', views.TeachersDetailView.as_view(), name='teachers_detail'),

【讨论】:

  • 我按照你说的做了,但还没有任何变化。我收到相同的错误“未找到 'teachers_detail' 的反向。'teachers_detail' 不是有效的视图函数或模式名称。”。我真的不知道该怎么办:(
  • @AlexMercer:你在 runserver 命令或点击127.0.0.1:8000/teachers url 时遇到同样的错误?
  • 更改:url(r'^teachers/$', views.TeachersDetailView.as_view(), name='teachers_detail') 到---------- -------------> path('teachers//', TeachersDetailView.as_view(), name='teachers_detail'),
【解决方案2】:

Teachers 模型具有自定义主键 (tcode) 并且它是一个字符串时,问题是由于 teachers_detail URL 路径采用整数参数 (&lt;int:pk&gt;)。

下面的path 应该可以工作(我用你的其余代码对其进行了测试):

path('teachers/<str:tcode>', views.TeachersDetailView.as_view(), name='teachers_detail')

【讨论】:

  • 我做到了...它还没有工作:(我不明白为什么 django 在基本 html 模板中的模板渲染期间显示错误(但基本 html 模板中没有错误?)
  • 它在基本 html 模板的第 0 行显示错误
  • 某些版本的 Django 错误地返回模板错误。打开 shell manage.py shell 并尝试 from education.models import Teachers; Teachers.objects.first().get_absolute_url() - 这将有助于缩小 URL 路径是否仍然导致错误。并仔细检查 URL 是否包含 &lt;str:tcode&gt; 而不是 &lt;int:pk&gt;
猜你喜欢
  • 2018-01-25
  • 2019-06-27
  • 2019-04-21
  • 2019-04-06
  • 2021-04-21
  • 1970-01-01
  • 2023-02-06
  • 2020-12-01
  • 2021-05-18
相关资源
最近更新 更多