【问题标题】:Pulling data from db causing 404 page not found error从 db 中提取数据导致 404 page not found 错误
【发布时间】:2019-07-10 06:40:50
【问题描述】:

我正在尝试以这样的方式过滤我的观点,即选择特定学校,学校的PK将放置在一个名为专业的视图函数中,这将进一步查询DB以显示对应的正确专业学校。

我现在收到一个找不到页面的 404 错误,不知道为什么。

url.py

from django.urls import path

from . import views


urlpatterns = [
    path('', views.index, name='index'),
    path('<int:Major>/', views.Major, name='Major')
]

models.py

from django.db import models

class Major(models.Model):
    name = models.CharField(max_length=30, db_index=True)

class School(models.Model):
    name = models.CharField(max_length=50, db_index=True)
    school_Major_merge = models.ManyToManyField(Major, through='School_Major')

class School_Major(models.Model):
    major = models.ForeignKey(Major, on_delete=models.CASCADE)
    school = models.ForeignKey(School, on_delete=models.CASCADE)


class professor(models.Model):
    ProfessorIDS = models.IntegerField()
    ProfessorName = models.CharField(max_length=100)
    ProfessorRating = models.DecimalField(decimal_places=2,max_digits=4)
    NumberofRatings = models.CharField(max_length=50)
    #delete major from the model  
    school = models.ForeignKey(School , on_delete=models.CASCADE)
    major = models.ForeignKey(Major , on_delete=models.CASCADE)

    def __str__(self):
        return self.ProfessorName

views.py

from django.http import HttpResponse
from django.shortcuts import render
from .models import professor, School, Major, School_Major

def index(request):
    schools = School.objects.all()
    return render(request, 'locate/index.html', {'schools': schools})

def Major(request, school_pk):
    #Filter to a show the association of 1 schools majors
    school_choice = Major_School.objects.filter(school_id = school_pk)
    #Filter majors names required
    majors = Major.objects.filter(id = school_choice.major_id)
    return render(request, 'locate/major.html', {'majors' : majors})

我将发布索引文件的代码,该文件将学校信息拉到下面,当点击学校(超链接集)时,它基本上假设将学校的主键传递给主要功能,然后再进行进一步过滤.

  <ul>
    {% for list in schools %}
    <li><a href="{% url 'Major' {{list.id}}">{{list.name}}</a></li>
    <br><br>
    {%endfor%}
  </ul>

学校的主键被正确提取,但由于某种原因,当我点击学校的超链接时,该功能没有启动,我收到 404 page not found 错误。

主要功能的目的, 1) 接收学校的主键,将传递到 M2M 表。 2) 现在只显示与该学校对应的专业,只过滤并存储与所选学校相关联的主键的专业

我认为我的函数逻辑是正确的,我只是无法再次理解为什么会出现 404 错误。

这是我点击第一所学校时的确切错误,它的 PK = 1

The current path, locate/{% url 'Major' 1/, didn't match any of these.

更新:

我根据以下建议进行了操作,并举了一个示例,我为 index.html 提供的格式适用于调度程序,并且调度程序也已正确设置,但是为什么 OH 为什么这样做 { % 仍然弹出我不明白,我重新启动了服务器,以为它可能在窃听,但 nada。

index.html

{% for list in schools %}
<li><a href="{% url 'Major' 'list.id' %}">{{list.name}}</a></li>
<br><br>
{%endfor%}

urls.py

from django.urls import path
from . import views


urlpatterns = [
    path('', views.index, name='index'),
    path('<int:school_pk>/', views.Major, name='Major')
]

我遇到的当前路径错误仍然相同,但我不明白的是在将模板修复为正确格式之后(我还使用了一个示例项目作为参考,但没有这个传递参数的问题)我不只是传递 /locate/school_pk 而是传递花括号和 %

locate/ [name='index']
locate/ <int:school_pk>/ [name='Major'] <== This one
admin/
register/ [name='register']
profile/ [name='profile']
login/ [name='login']
logout/ [name='logout']
[name='blog-home']
about/ [name='blog-about']
post/<int:pk>/ [name='post-detail']
post/new/ [name='post-create']
post/<int:pk>/update/ [name='post-update']
post/<int:pk>/delete/ [name='post-delete']
user/<str:username> [name='user-posts']
^media/(?P<path>.*)$

The current path, locate/{% url 'Major' 1/, didn't match any of these.

请注意其中添加了 {%,即使在我纠正了错误之后也是如此。

【问题讨论】:

    标签: django python-3.x django-templates


    【解决方案1】:

    我认为模板应该是:

    <li><a href="{% url 'Major' list.id %}">{{list.name}}</a></li>
    

    网址是这样的:

    path('<int:school_pk>/', views.Major, name='Major')
    

    参考请查看documentation

    【讨论】:

    • 我试过了,没用我会检查文档参考,我也注意到我在list.id后面打错了我应该有%},
    【解决方案2】:

    在你的 for 循环中应该是

    <ul>
        {% for list in schools %}
            <li><a href="{% url 'Major' list.id">{{list.name}}</a></li>
            <br><br>
        {%endfor%}
    </ul>
    

    只需去掉双花括号{{ }}

    【讨论】:

    • 它不起作用我现在注意到花括号正试图在奇怪的 url 中被查询,我在我的更新中发布了
    【解决方案3】:

    所以我注意到错误消息中这个特定的 url dispatcher 之间有一个空格

    locate/ [name='index']
    locate/ <int:school_pk>/ [name='Major'] <== This one
    admin/
    register/ [name='register']
    profile/ [name='profile']
    login/ [name='login']
    logout/ [name='logout']
    [name='blog-home']
    about/ [name='blog-about']
    post/<int:pk>/ [name='post-detail']
    post/new/ [name='post-create']
    post/<int:pk>/update/ [name='post-update']
    post/<int:pk>/delete/ [name='post-delete']
    user/<str:username> [name='user-posts']
    ^media/(?P<path>.*)$
    
    The current path, locate/{% url 'Major' 1/, didn't match any of these.
    

    所以我在 url.py 中添加了一个空格,似乎成功了

    url.py

    from django.urls import path
    
    from . import views
    
    
    urlpatterns = [
        path('', views.index, name='index'),
        path(' <int:school_pk>/', views.Major, name='Major')
    ]
    

    我在主项目中的所有其他 url 都以相同的方式设置,但没有这个问题,但由于某种原因,我尝试的所有东西都不会轻推,我必须放置一个空格才能让它工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2020-12-05
      • 2019-12-10
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多