我如何在url中实现我的sluig而不是Django中的主键?

时间:2018-10-09 00:15:56

标签: django python-3.x django-forms django-views

上次未正确定义详细信息的道歉。在这里,我已编辑并发布了更多详细信息。我正试图将自己的子弹打入我的网址。这是来自应用目录中的utils.py的内容:

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。 预先感谢

1 个答案:

答案 0 :(得分:0)

我已经弄清楚了,感谢您的关心。我在网址中同时调用了sulg和pk,并通过 pk ='5'找不到来解决了该问题,编辑如下:

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>

我忘了在这里打电话给ug和pk。