Django:在模板中使用 Slug 的问题
Django: Problem with Using Slug in Templates
我是 Django 的初学者。我正在构建一个名为 PhoneReview 的 Django 应用程序。它将存储与最新手机相关的评论 phone。它还将显示 phone 个品牌,以及相关的 phone 个型号。
我已经创建了模型、视图和模板文件。现在,我面临一个问题。我不能在 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中,我尝试将<li><a href = "{% url 'details' phonemodel.id %}">{{ phonemodel.model_name }}</a></li>
替换为<li><a href = "{% url 'details' phonemodel.slug %}">{{ phonemodel.model_name }}</a></li>
。但是我得到了错误。
我该如何解决这个问题?
更新: 我添加了@arjun 提供的代码。但是,我收到一个错误。内容如下
OperationalError at /index
no such table: PhoneReview_brand
如果您想使用 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'
我是 Django 的初学者。我正在构建一个名为 PhoneReview 的 Django 应用程序。它将存储与最新手机相关的评论 phone。它还将显示 phone 个品牌,以及相关的 phone 个型号。
我已经创建了模型、视图和模板文件。现在,我面临一个问题。我不能在 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中,我尝试将<li><a href = "{% url 'details' phonemodel.id %}">{{ phonemodel.model_name }}</a></li>
替换为<li><a href = "{% url 'details' phonemodel.slug %}">{{ phonemodel.model_name }}</a></li>
。但是我得到了错误。
我该如何解决这个问题?
更新: 我添加了@arjun 提供的代码。但是,我收到一个错误。内容如下
OperationalError at /index
no such table: PhoneReview_brand
如果您想使用 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'