【问题标题】:Django: Problem with Using Slug in TemplatesDjango:在模板中使用 Slug 的问题
【发布时间】:2020-03-07 19:26:54
【问题描述】:

我是 Django 的初学者。我正在构建一个名为 PhoneReview 的 Django 应用程序。它将存储与最新手机相关的评论。它还将显示手机品牌以及相关的手机型号。

我已经创建了模型、视图和模板文件。现在,我面临一个问题。我不能在 URL 中使用 slug。现在,它看起来像这样:

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

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

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

from . import views
from django.urls import path

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

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

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.DetailView):
    model = PhoneModel
    template_name = 'PhoneReview/phonemodel.html'

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

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

from django.apps import AppConfig


class PhonereviewConfig(AppConfig):
    name = 'PhoneReview'

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

{% 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 'modellist' brand.id %}">{{ brand.brand_name }}</a></li>

        {% endfor %}
    </ul>
<img src="{% static "images/brandlist.jpg" %}" alt="Super Mario Odyssey" /> <!-- New line -->
{% endblock %}

这是我的 phonemodel.html 代码,位于 templates 文件夹中:

{% 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>
        <li><a href = "{% url 'details' phonemodel.id %}">{{ phonemodel.model_name }}</a></li>
    </ul>
<img src="{% static "images/brandlist.jpg" %}" alt="Super Mario Odyssey" /> <!-- New line -->
{% endblock %}

index.html 中,我尝试将 &lt;li&gt;&lt;a href = "{% url 'details' phonemodel.id %}"&gt;{{ phonemodel.model_name }}&lt;/a&gt;&lt;/li&gt; 替换为 &lt;li&gt;&lt;a href = "{% url 'details' phonemodel.slug %}"&gt;{{ phonemodel.model_name }}&lt;/a&gt;&lt;/li&gt;。但我得到了错误。

我该如何解决这个问题?

更新:我添加了@arjun 提供的代码。但是,我收到一个错误。它说如下

OperationalError at /index
no such table: PhoneReview_brand

【问题讨论】:

    标签: python django slug


    【解决方案1】:

    如果你想使用 slug,你需要通过你的 url 传递 slug 而不是 pk

    path('phonemodel/<slug:slug>/', views.ModelView.as_view(), name='modellist'),
    path('details/<slug:slug>/', views.ReviewView.as_view(), name='details'),
    

    现在在模板中而不是 id

    <li><a href = "{% url 'details' phonemodel.slug %}">{{ phonemodel.model_name }}</a></li>
    

    最好有独特的 slug 字段

     slug = models.SlugField(max_length=150, unique=True)
    

    另外我建议你使用django-autoslug。它是一个可重用的 Django 库,提供了一个改进的 slug 字段,可以自动从另一个字段填充自己。

    编辑:您尚未在详细视图中传递context_object_name,因此请在此处提供上下文

    class ModelView(generic.DetailView):
        model = PhoneModel
        template_name = 'PhoneReview/phonemodel.html'
        context_object_name= 'phonemodel'
    

    【讨论】:

    • 当我添加您的代码时,我收到“找不到页面 (404)”错误。它显示以下内容:找不到页面 (404) 请求方法:GET 请求 URL:127.0.0.1:8000/phonemodel/1 引发者:PhoneReview.views.ModelView 找不到与查询匹配的手机型号
    • @Shawn 如果您使用的是slug,那么请提供您的 slug 字段而不是 id 1127.0.0.1:8000/phonemodel/you-slug-field
    • 链接应该是点击手机型号时自动生成的,比如Galaxy S10。
    • 我不应该在浏览器中输入任何 URL。点击手机模式后,如 Galaxy S10,链接应该会自动生成。
    • @Shawn 因为它是一个蛞蝓。就像我们用&lt;int:pk&gt;为pk指定int一样
    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2020-03-17
    • 2012-05-14
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多