[英]Django: Getting NoReverseMatch Error While Attempting to Use Slug in URLs
[英]Django: 404 Error Appears While Trying to Use Slug in URLs
我是 Django 的初學者。 現在,我正在通過構建一個名為 PhoneReview 的應用程序來學習該框架。 它將存儲與最新手機相關的評論。 它還將顯示手機品牌,以及相關的手機型號及其評論。
現在,我正在嘗試在 URL 中使用 slug。 我已經在我的兩個模板中成功使用了 slug,它們是index.html和phonemodel.html 。 但是,我遇到了第三個模板的問題,即details.html 。
當我 go 到http://127.0.0.1:8000/index時,我看到了這個頁面:
當我點擊Samsung時,我看到這個頁面:
到此為止還好。 但是當我點擊任何手機 model,比如Galaxy S10時,我會收到 404 錯誤。 它看起來像這樣:
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.
當我點擊三星時,我應該看到詳細信息。html頁面,其中有手機的評論,以及新聞鏈接。 相反,我收到了 404 錯誤。
這是我位於 PhoneReview 文件夾中的models.py代碼:
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代碼:
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代碼:
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'
以下是位於 PhoneReview 文件夾中的apps.py代碼:
from django.apps import AppConfig
class PhonereviewConfig(AppConfig):
name = 'PhoneReview'
這是我的index.html代碼,位於模板文件夾內:
{% 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的代碼:
{% 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 %}
這是我的詳細代碼。html位於模板文件夾內:
{% 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或details.html中犯了任何錯誤嗎?
我認為這里的代碼沒有錯誤。 通過python3 manage.py shell
打開 Django shell 然后運行以下查詢
我想這可能會給出NotFound
錯誤,因為沒有 model 和 slug galaxy-s10
from your_app.models import Review
samsung_s10 = Review.objects.get(slug='galaxy-s10')
print(smasung_s10.slug)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.