Django:尝试在网址中使用Slug时出现404错误 [英] Django: 404 Error Appears While Trying to Use Slug in URLs

查看:46
本文介绍了Django:尝试在网址中使用Slug时出现404错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Django的初学者。现在,我正在通过构建一个名为PhoneReview的应用程序来学习该框架。它将存储与最新手机有关的评论。它还会显示电话品牌,以及相关的电话型号及其评论。

I am a beginner in Django. Right now, I am learning the framework by building an app, called PhoneReview. It will store reviews related to the latest mobile phone. It will also display phone brands, along with the associated phone models and their reviews.

现在,我正在尝试在URL中使用Slug。我已经在两个模板中成功使用了Slug,这两个模板是 index.html phonemodel.html 。但是,我遇到的第三个模板是 details.html

Right now, I am trying to use slug in URLs. I have successfully used slug in two of my templates, which are index.html and phonemodel.html. However, I am facing issues with the third template, which is details.html.

当我转到

当我单击三星时,我看到此页面:

When I click on Samsung, I see this page:

到此为止就可以了。
但是,当我单击任何手机型号(例如 Galaxy S10 )时,都会出现404错误。看起来像这样:

Up to this is fine. But when I click on any phone model, like Galaxy S10, I get 404 error. It looks like this:

Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/details/galaxy-s10
Raised by:  PhoneReview.views.ReviewView
No review found matching the query

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

当我单击Samsung时,应该会看到 details.html >页面,其中包含电话的评论以及新闻链接。相反,我收到了404错误。

When I click on Samsung, I am supposed to see the details.html page, which has the review of the phone, along with the news link. Instead, I am getting the 404 error.

这是我位于PhoneReview文件夹中的 models.py 的代码:

Here are my codes of models.py located inside PhoneReview folder:

from django.db import models
from django.template.defaultfilters import slugify

# Create your models here.
class Brand(models.Model):
    brand_name = models.CharField(max_length=100)
    origin = models.CharField(max_length=100)
    manufacturing_since = models.CharField(max_length=100, null=True, blank=True)
    slug = models.SlugField(max_length=150, null=True, blank=True)

    def __str__(self):
        return self.brand_name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.brand_name)
        super().save(*args, **kwargs)

class PhoneModel(models.Model):
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    model_name = models.CharField(max_length=100)
    launch_date = models.CharField(max_length=100)
    platform = models.CharField(max_length=100)
    slug = models.SlugField(max_length=150, null=True, blank=True)

    def __str__(self):
        return self.model_name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.model_name)
        super().save(*args, **kwargs)

class Review(models.Model):
    phone_model = models.ManyToManyField(PhoneModel, related_name='reviews')
    review_article = models.TextField()
    date_published = models.DateField(auto_now=True)
    slug = models.SlugField(max_length=150, null=True, blank=True)
    link = models.TextField(max_length=150, null=True, blank=True)

    def __str__(self):
        return self.review_article

这是我位于PhoneReview文件夹中的 urls.py 的代码:

Here are my codes of urls.py located inside PhoneReview folder:

from . import views
from django.urls import path

app_name = 'PhoneReview'

urlpatterns = [
    path('index', views.BrandListView.as_view(), name='brandlist'),
    path('phonemodel/<slug:slug>', views.ModelView.as_view(), name='modellist'),
    path('details/<slug:slug>', views.ReviewView.as_view(), name='details'),
]

这是我位于PhoneReview文件夹内的 views.py 的代码:

Here are my codes of views.py located inside PhoneReview folder:

from django.shortcuts import render, get_object_or_404
from django.views import generic
from .models import Brand, PhoneModel, Review


class BrandListView(generic.ListView):
    template_name = 'PhoneReview/index.html'
    context_object_name = 'all_brands'

    def get_queryset(self):
        return Brand.objects.all()


class ModelView(generic.ListView):
    template_name = 'PhoneReview/phonemodel.html'
    context_object_name = 'all_model_name'

    def get_queryset(self):
        self.brand = get_object_or_404(Brand, slug=self.kwargs['slug'])
        return PhoneModel.objects.filter(brand=self.brand)

class ReviewView(generic.DetailView):
    model = Review
    template_name = 'PhoneReview/details.html'

这是我的 apps.py 代码,位于PhoneReview文件夹中:

Here are my codes of apps.py located inside PhoneReview folder:

from django.apps import AppConfig


class PhonereviewConfig(AppConfig):
    name = 'PhoneReview'

这是我的 index.html 代码,位于模板文件夹中:

Here are my codes of index.html located inside templates folder:

{% extends 'PhoneReview/base.html' %}

{% load static %}

{% block title%}
Brand List
{% endblock %}

{% block content %}
<!--Page content-->
<h1>This is Brand List Page</h1>
<h2>Here is the list of the brands</h2>
    <ul>
        {% for brand in all_brands %}
<!--            <li>{{ brand.brand_name }}</li>-->
            <li><a href = "{% url 'PhoneReview:modellist' brand.slug %}">{{ brand.brand_name }}</a></li>
        {% endfor %}
    </ul>
<img src="{% static "images/brandlist.jpg" %}" alt="Super Mario Odyssey" /> <!-- New line -->
{% endblock %}

这是我的 phonemodel.html 位于模板文件夹内:

Here are my codes of phonemodel.html located inside templates folder:

{% extends 'PhoneReview/base.html' %}

{% load static %}

{% block title%}
Phone Model Page
{% endblock %}

{% block content %}
<!--Page content-->
<h1>This is Phone Model Page</h1>
<h2>Here is the phone model</h2>
    <ul>
        {% for phonemodel in all_model_name %}
            <li><a href = "{% url 'PhoneReview:details' phonemodel.slug %}">{{ phonemodel.model_name }}</a></li>
        {% endfor %}
    </ul>
<img src="{% static "images/brandlist.jpg" %}" alt="Super Mario Odyssey" /> <!-- New line -->
{% endblock %}

这是我的 details.html 位于模板文件夹内:

Here are my codes of details.html located inside templates folder:

{% extends 'PhoneReview/base.html' %}
{% load static %}

<html>

<link rel="stylesheet" type="text/css" href="{% static "css/style.css" %}">


<html lang="en">

{% block title%}Details{% endblock %}

{% block content %}

<h1>This is the Details Page</h1>

<h2>Review:</h2>
<p>{{ review.review_article }}</p>

<h2>News Link:</h2>
<a href={{ review.link }}>{{ review.link }}</a>
{% endblock %}
</html>

我在 models.py 详细信息中是否犯了任何错误? .html

推荐答案

我认为此处的代码中没有错误。通过 python3 manage.py shell 打开Django shell,然后运行以下查询

I don't think there is an error in the code here. open Django shell by python3 manage.py shell then run the following query

我想这可能会给 NotFound 错误,因为没有模型有 galaxy-s10

I guess this will probably give NotFound error because there is no model with slug galaxy-s10

from your_app.models import Review

samsung_s10 = Review.objects.get(slug='galaxy-s10')
print(smasung_s10.slug)

这篇关于Django:尝试在网址中使用Slug时出现404错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆