Как мне реализовать мой sluig в моем URL вместо первичного ключа в Django? - PullRequest
0 голосов
/ 09 октября 2018

Извинение за неправильное определение деталей в прошлый раз.Здесь я отредактировал и пост с более подробной информацией.Я пытаюсь проникнуть в мою ссылку.Вот slugify из 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' - это URL, к которому я обращаюсь get_absolute_url.Заранее спасибо

1 Ответ

0 голосов
/ 09 октября 2018

Я понял это, я ценю все заботы.Я назвал sulg и pk в своем URL, и это решило проблему с pk = '5' not found , отредактировано так:

url(r'^(?P<slug>[\w-]+)/(?P<pk>\d+)/$', views.PostDetailView.as_view(),name='detail'

Маркировка одинакова для URL-адреса UpdateView иDeleteView также.
, а затем в get_absolute_url в models.py я снова вызвал slug и pk на views.py:

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 здесь.

...