Добавить дату к URL-адресу страницы блога

Я создаю свой первый сайт трясогузки django. На моем сайте есть часть блога, и я хотел бы добавить дату публикации в URL-адрес. В настоящее время при добавлении страницы URL-адрес становится следующим: example.com/blog/[slug], но я хочу, чтобы он был следующим: example.com/blog/2015/11/19/[slug]

Моя страница блога:

class BlogPage(Page):
    main_image = models.ForeignKey(
        'wagtailimages.Image',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+'
    )
    date = models.DateField("Post date")
    intro = models.CharField(max_length=250)
    body = RichTextField(blank=True)

    search_fields = Page.search_fields + (
        index.SearchField('intro'),
        index.SearchField('body'),
    )

    content_panels = Page.content_panels + [
        FieldPanel('date'),
        ImageChooserPanel('main_image'),
        FieldPanel('intro'),
        FieldPanel('body'),
    ]

person Jab    schedule 19.11.2015    source источник
comment
Вы знаете, как передавать переменные в URL? Я могу помочь с этой частью, но я не знаю, как извлечь определенные части даты и поместить их в URL-адрес.   -  person Programmingjoe    schedule 20.11.2015
comment
Вот документация: https://docs.djangoproject.com/en/1.8/topics/http/urls/   -  person Programmingjoe    schedule 20.11.2015
comment
У меня нет под рукой полного решения, но я бы посоветовал взглянуть на пользовательские route методы docs.wagtail.io/en/v1.2/reference/pages/ или, возможно, сделать что-то с RoutablePageMixin: docs.wagtail.io/en/v1.2/reference/contrib/routablepage .html   -  person gasman    schedule 20.11.2015


Ответы (2)


Я не уверен, что вы можете интегрировать это с трясогузкой, но вот пример того, как вы можете добиться этого с помощью django:

  1. Обновите свою модель, чтобы автоматически генерировать слаг (например, : на основе заголовка) в blog/models.py :
from django.db import models
from django.utils.text import slugify
from django.utils.timezone import now

class Post(models.Model):
    # your attributes
    date = models.DateTimeField(default=now())
    title = models.CharField(max_length=250)
    slug = models.SlugField()

    def save(self):
        """
        Generate and save slug based on title
        """
        super(Post, self).save()
        self.slug = slugify(self.title)
        super(Post, self).save()
  1. Добавьте новый URL-адрес в приложение для блога (blog/urls.py):
url(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/(?P<slug>[\w-]+)$', views.post_details)
  1. Определите представление, чтобы получить сообщение в blog/views.py :
def post_details(request, year, month, day, slug):
    post = Post.objects.get(slug=slug, date__year=year, date__month=month, date__day=day)
    # do what you want with this post
person Louis Barranqueiro    schedule 19.11.2015
comment
Используйте ниже RegEx для однозначных и двузначных значений месяца и дня: - person Thejesh PR; 09.09.2017
comment
url(r'^(?P‹год›[0-9]{4})/(?P‹месяц›[0-9]{1,2})/(?P‹день›[0-9] {1,2})/(?P‹slug›[\w-]+)$' , views.post_details), - person Thejesh PR; 09.09.2017

Вот более специфичный для трясогузки способ реализации этого решения, он предполагает, что у вас также есть BlogIndexPage, который содержит все страницы блога внизу. Хотя это будет работать, даже если ваши страницы блога существуют на домашней странице, просто соответствующим образом измените метод маршрута.

Обзор:

  • Мы будем обновлять вложенные URL-адреса в BlogPageIndex (или любой другой странице, на которой расположены страницы вашего блога). Мы делаем это, добавляя миксин RoutablePageMixin.
  • Затем мы можем использовать @route в качестве декоратора над методом BlogPageIndex для любых настраиваемых представлений, которые нам нужны.
  • Наконец, нам нужно обновить нашу модель BlogPage, чтобы ее обычный URL-адрес соответствовал нашему новому сопоставлению URL-адресов. Мы делаем это, переопределяя set_url_path на нашей странице блога.
  • При этом будет использоваться обычное поле slug из модели BlogPage и поле date_published для создания нового url_path.

См. пример /myapp/models.py

from django.shortcuts import get_object_or_404

from wagtail.contrib.routable_page.models import RoutablePageMixin, route
from wagtail.wagtailcore.models import Page


class BlogPage(Page):
    # using date_published instead of date to reduce ambiguity
    date_published = models.DateField(
        "Date post published", blank=True, null=True
    )
    # ...other fields:  main_image, intro, body
    # ...search_fields
    # ...content_panels

    # override the set_url_path method to use generate different URL
    # this is updated on save so each page will need to be re-published
    # old URL will still work
    def set_url_path(self, parent):
        # initially set the attribute self.url_path using the normal operation
        super().set_url_path(parent=parent)
        self.url_path = self.url_path.replace(
            self.slug, '{:%Y/%m/%d/}'.format(self.date_published) + self.slug
        )


class BlogIndexPage(RoutablePageMixin, Page):
    # note - must inherit RoutablePageMixin AND Page

    # ...other fields
    # ...search_fields
    # ...content_panels

    # route for sub-pages with a date specific URL for posts
    # this will NOT make a list of pages at blog/2018 just specific blogs only
    @route(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/(?P<slug>[\w-]+)/?$')
    def blog_page_by_date(self, request, year, month, day, slug, name='blog-by-date'):
        """Serve a single blog page at URL (eg. .../2018/01/23/my-title/)"""
        blog_page = get_object_or_404(
            BlogPage,
            date_published__year=year,
            date_published__month=month,
            date_published__day=day,
            slug=slug
        )
        return blog_page.serve(request)

    # Speficies that only BlogPage objects can live under this index page
    subpage_types = ['BlogPage']

Предостережения:

  • Каждую существующую страницу блога необходимо будет повторно сохранить, чтобы активировать обновления url_path.
  • Исходный url_path по-прежнему будет работать и не перенаправлять, можно добавить перенаправление, переопределив serve и проверяет, использовался ли старый URL, а затем перенаправляет.
  • При этом не учитываются какие-либо последствия для SEO наличия нескольких URL-адресов для страниц.
person LB Ben Johnston    schedule 22.01.2018