该视图仅适用于PK,但是问题是我在直播站点上的PK是不连贯的字符串,因此我想使其连贯地贴合标题,以提高SEO。我不想将PK更改为Slug。我都想要
当我尝试同时添加PK和子弹时,它失败了,并且我得到了错误:没有反向匹配。
URL路径:
1
型号:
path('idea/<slug:slug>,<int:pk>', views.IdeaDetailView.as_view(), name='detail')
Views.py:
class Idea(models.Model):
idea_id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Searches ID')
idea_number = models.IntegerField(blank=True, null=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
idea_title = models.CharField(max_length=300, blank=True, null=True)
idea_text = NonStrippingTextField(max_length=10000, blank=True, null=True)
Admin.py:
class IdeaDetailView(generic.DetailView):
model = Idea
template_name = "idea/detail.html"
def get_context_data(self, **kwargs):
context = super(IdeaDetailView, self).get_context_data(**kwargs)
context['results'] = Idea.objects.filter(idea_id=self.kwargs.get('pk'))
return context
我想添加一个想法(idea_title),但是,如果我尝试将其添加到URL中,则会失败。
答案 0 :(得分:0)
尝试将slugfield,get_absolute_url方法添加到您的Idea模型中,如下所示:
from django.conf import settings
from django.db import models
from django.urls import reverse
from django.utils.text import slugify
class Idea(models.Model):
idea_id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Searches ID')
idea_number = models.IntegerField(blank=True, null=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
idea_title = models.CharField(max_length=300, blank=True, null=True)
idea_text = NonStrippingTextField(max_length=10000, blank=True, null=True)
slug = models.SlugField(
default='',
editable=False,
max_length=300,
)
def get_absolute_url(self):
kwargs = {
'pk': self.id,
'slug': self.slug
}
return reverse('idea-pk-slug-detail', kwargs=kwargs)
def save(self, *args, **kwargs):
value = self.title
self.slug = slugify(value, allow_unicode=True)
super().save(*args, **kwargs)
然后,在urls.py中:
path('idea/<int:pk>-<str:slug>/', views.IdeaDetailView.as_view(), name='detail')
然后,在views.py中的template_name下:
query_pk_and_slug = True
找到另外两种方法和更多信息HERE。
希望这会有所帮助!