Рубрики
Без рубрики

Django slug + id urls: Копирование шаблона URL Dev.to

Одна из вещей, которые мне нравятся в Dev.To, – это их дизайн URL. Он сочетает в себе слизняк с хэшированным реп -репсом … Помечено с Джанго, Python, Tutorial, WebDev.

Одна из вещей, которые мне нравятся в Dev.To, – это их дизайн URL. Он сочетает в себе слизняк с хешированным значением, представляющим внутренний представитель какого -то значения индекса для обеспечения уникальности. Вы можете увидеть его в моем посте «Автодокументирование Makefiles», представленных в URL «https://dev.to/feldroy/autodocumenting-makefiles-175b».

Давайте разберемся с этим URL:

  1. Фелдрой это название моей компании.
  2. Автодокументирование-мак-файлы это слизняк и основан на названии статьи.
  3. 175b является хешированным значением, которое либо хранится в индексированном поле символов, либо разбито маршрутизатором в числовой первичный ключ.

Вот еще один способ взглянуть на их дизайн URL:

///

Давайте посмотрим, как мы можем реализовать упрощенную версию этой техники, используя Django.

Мы идем с более простой версией Dev.to реализация. Наша реализация будет использовать первичный ключ базы данных для обеспечения уникальности, а не хешированного значения, на которое опирается Dev.to Анкет

////

Хорошо, теперь, когда мы определили наш дизайн URL, давайте построим его!

Модель

Храните данные!

# articles/models.py
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _

class Article(models.Model):

    title = models.CharField(_("Title"), max_length=100)
    slug = models.CharField(_("Slug"), max_length=100)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, 
        on_delete=models.CASCADE)
    # More fields...

Форма

Соберите и проверяйте данные!

# articles/forms.py
from django import forms

from .models import Article

class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article
        fields = ('title', ) # more fields

Виды

Теперь, когда у нас есть модель и форма, давайте создадим взгляды:

# articles/views.py
from django.shortcuts import get_object_or_404
from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils import slugify
from django.views.generic import CreateView, DetailView, UpdateView

from .forms import ArticleForm
from .models import Article


class ArticleCreateView(LoginRequiredMixin, CreateView):

    model = Article
    form_class = ArticleForm

    def form_valid(self, form):
        # Save the data to an article object - 
        #   this hasn't yet saved to the database.
        article = form.save(commit=False)
        article.slug = slugify(article.title)
        article.author = self.request.user
        # Save again - this time to the database
        article.save()
        return super().form_valid(form)


class ArticleUpdateView(LoginRequiredMixin, UpdateView):
    model = Article
    form_class = ArticleForm

    def get_object(self):
        # We get records by primary key, which ensures that
        # changes in the title or slug doesn't break links
        return get_object_or_404(Article,
            id=self.kwargs['pk'],
            author__username=self.kwargs['username'],
            author=self.request.user
        )

    def form_valid(self, form):
        # Update the slug if the title has changed.
        article = form.save(commit=False)
        article.slug = slugify(article.title)
        article.save()
        return super().form_valid(form)        


class ArticleDetailView(DetailView):
    model = Article

    def get_object(self):
        # We get records by primary key, which ensures that
        # changes in the title or slug doesn't break links
        return get_object_or_404(Article,
            id=self.kwargs['pk'],
            author__username=self.kwargs['username']
        )        

URL

Давайте направим это в наши URL:

# articles/urls.py
from django.urls import path

from articles import views

urlpatterns = [
    path(route='/new/',
        view=views.ArticleCreateView.as_view(),
        name='create',
    ),
    path(route='////edit/',
        view=views.ArticleUpdateView.as_view(),
        name='update',
    ), 
    path(route='////',
        view=views.ArticleDetailView.as_view(),
        name='detail',
    ),       
]

И в корневой конфигурации проекта мы добавляем это:

# config/urls.py or wherever you stick the project's root urls.py
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    # Django Admin, change this URL
    path('two-scoops-of-django-is-awesome', admin.site.urls),
    # Articles management
    path('', include('articles.urls', namespace='article')),
    # More URLS here
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

# There's certainly more URLs down here

Добавьте шаблоны, и вот они, пример Django, который следует за Dev.to URL -дизайн!

Опытные пользователи Django будут знать, что логика слизняка в form_valid Методы должным образом принадлежат к модели статьи save () Метод, а не представления. Это то, что мы обсудим в Два соска Django Анкет

Говоря об этом, если вы хотите выучить всевозможные усовершенствования и советы, взгляните на меня и на мой жена В моей тематике мороженого книга и Курс На лучших практиках Джанго.

Оригинал: “https://dev.to/danielfeldroy/django-slug-id-url-design-3l8b”