fbpx

Как сделать человекочитаемые урлы в Джанго

287 просмотра
0
0 Комментариев

Джанго 2.0.
Самый простой блог пишем, который можно придумать.
К примеру models.py я написал так

class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    slug = models.SlugField('id_url', max_length=255, unique=True, blank=True, null=True)
    created_date = models.DateTimeField(
        default=timezone.now)
    published_date = models.DateTimeField(
        blank=True, null=True)
 
    def get_absolute_url(self):
        return redirect('post_detail', slug=self.slug)
 
    def publish(self):
        self.published_date = timezone.now()
        self.save()
 
    def __str__(self):
        return self.title

A urls.py выглядит вот так:

urlpatterns = [
    path(r'', views.post_list, name='post_list'),
    # path(r'post/<int:pk>/', views.post_detail, name='post_detail'),
    path(r'post/<str:slug>/', views.post_detail, name='post_detail'),
]

Напомню, что моя цель сделать так, чтобы урл можно было задавать самому в админке.

Во views.py главную страницу нам возвращает такая функция

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
    return render(request, 'test/blog.html', {'posts': posts})

А вот что я должен написать, чтобы нам возвращалась страница поста при клике на него с урлом, который мы зададим в админке, я не могу понять.


Добавить комментарий

1 Ответы

Python Опубликовано 15.06.2019
0

Для начала надо задать название приложения в главном urls.py, допустим, это appname.

В шаблоне можем использовать тэг url и цикл по статьям.

test/blog.html

{% for post in posts %}
    <a href="{% url 'appname:post_detail' post.slug %}">
        {{ post.title }}
    </a>
{% endfor %}

И views.post_detail должен выглядеть примерно так:

def post_detail(request, slug):
    post = Post.objects.get(slug=slug)
    return render(request, 'test/post.html', {'post': post})

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up