django - 如何在我的 url 中实现我的 sluig 而不是 Django 中的主键?
问题描述
为上次没有正确定义细节而道歉。在这里,我已经编辑并发布了更多详细信息。我正试图让我的 slug 进入我的网址。这是来自 app 目录中 utils.py 的 slugify:
from django.utils.text import slugify
def get_unique_slug(model_instance, slugable_field_name, slug_field_name):
slug = slugify(getattr(model_instance, slugable_field_name))
unique_slug = slug
extension = 1
ModelClass = model_instance.__class__
while ModelClass._default_manager.filter(
**{slug_field_name: unique_slug}
).exists():
unique_slug = '{}-{}'.format(slug, extension)
extension += 1
return unique_slug
这是我的模型:
from django.db import models
from django.urls import reverse
from .utils import
class Post(models.Model):
name = models.CharField(db_index=True, max_length=300, blank=False)
content = models.TextField()
slug = models.SlugField(max_length=140, unique=True)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if not self.slug:
self.slug = get_unique_slug(self, 'name', 'slug')
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse("pastebin_app:detail",kwargs={'slug':self.slug})
和 urls.py 代码:
from django.conf.urls import url
from . import views
from .views import PostCreateView, PostCreateView, PostUpdateView, PostDeleteView,SearchView
app_name = 'pastebin_app'
urlpatterns = [
url(r'^search/$', views.SearchView.as_view(), name = 'search'),
url(r'^$', views.PostCreateView.as_view(), name = 'root'),
url(r'^(?P<slug>\[-\w\d]+)/$', views.PostDetailView.as_view(),name='detail'),
url(r'^update/(?P<slug>\[-\w]+)/$', views.PostUpdateView.as_view(),name='update'),
url(r'^delete/(?P<slug>\[-\w]+)/$', views.PostDeleteView.as_view(),name='delete'),
]
所以现在我收到带有异常值的 NoReverseMatch 错误:异常值:
Reverse for 'detail' with keyword arguments '{'slug': 'slug-implemention2'}' not found. 1 pattern(s) tried: ['(?P<slug>\\[-\\w\\d]+)/$']
'detail' 是我正在执行 get_absolute_url 的 url。提前致谢
解决方案
我已经弄清楚了,我感谢所有的关注。我在我的网址中都调用了 sulg 和 pk ,这解决了pk='5' not found的问题,编辑如下:
url(r'^(?P<slug>[\w-]+)/(?P<pk>\d+)/$', views.PostDetailView.as_view(),name='detail'
UpdateView url 和 DeleteView 的标记也是一样的。
然后在models.py中的get_absolute_url,我在views.py中再次调用了slug和pk:
def get_absolute_url(self):
return reverse("pastebin_app:detail",kwargs={'slug':self.slug,
'pk': self.pk})
然后我忘记了许多像我这样的初学者可能会做的另一件事是更新详细信息模板,其中我有两个按钮用作 UpdateView 和 DetailView。我不确定这可能有一些捷径
也:
<a class="btn btn-primary" href="{% url 'pastebin_app:update' slug=post_detail.slug pk=post_detail.pk %}" role="button">Update</a></p>
<a class="btn btn-warning" href="{% url 'pastebin_app:delete' slug=post_detail.slug pk=post_detail.pk %}" role="button">Delete</a>
我忘记在这里调用 slug 和 pk 了。
推荐阅读
- php - 在 laravel 中使用资产链接到 css 文件
- swift - 将 Java 三部分 for 循环转换为 Swift
- django - Django中基于类的视图中的样式表单字段
- javascript - 对象内部的匿名函数
- wso2 - 如何使用 AdminServices 在 WSO2 MB 中获取主题中的消息计数
- leaflet.markercluster - Leaflet markercluster - 点击放大然后spiderfy
- ios - 旋转关闭 tableview 扩展部分时不执行动画
- c# - C#透明面板?
- angular - Angular 5将局部变量设为全局
- python - 来自输入文本 Python 的 Min,Max Avg 使循环通用