难以将子弹添加到Django中的通用详细信息视图中

问题描述 投票:0回答:1

该视图仅适用于PK,但是问题在于,我在现场站点上的PK是不连贯的字符串,我想使它成为文章的连贯标题,以提高SEO。我不想将PK更改为。我都想要

[当我尝试同时添加PK和子弹时,它失败,并且我收到错误消息:没有反向匹配。

URL路径:

 path('idea/<slug:slug>,<int:pk>', views.IdeaDetailView.as_view(), name='detail')

型号:

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)

Views.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

Admin.py:

class IdeaAdmin(admin.ModelAdmin):
       prepopulated_fields = {"slug": ("idea_title",)}

我想添加一个Idea_title的条目,但是,如果我尝试将其添加到URL中,它将失败。

django primary-key django-urls slug
1个回答
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

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.