Как создать представление для деталей одного поста и URL в Django? - PullRequest
1 голос
/ 25 октября 2019

Я создаю сайт с приложением для блога в django 2.2. У меня проблема только с последним шагом, который заключается в создании представления для одного сообщения. К сожалению, я не знаю, как это закончить.

Я создал простейшее представление, которое только могу, но после ввода я получаю ошибку 500 от сервера.

 def single_post(request):
     return render(request=request, template_name="posts/single_post.html")

Этомоя модель, представление и URL:

models.py

# Post models
from django.db import models
from datetime import datetime
from django.utils.text import slugify

class Post(models.Model):
    title = models.CharField(max_length=150, verbose_name="Tytuł")
    content = models.TextField(verbose_name="Zawartość")
    lead = models.CharField(max_length=35, verbose_name="Skrót artykułu")
    published = models.DateTimeField(verbose_name="Data publikacji", default=datetime.now())
    slug = models.SlugField(unique=True)
    cover = models.ImageField(upload_to='images/')

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Post, self).save(*args, **kwargs)

    def __str__(self):
        return self.title

urls.py

from django.contrib import admin
from django.urls import path, include
from . import views

app_name = "posts"

urlpatterns = [
    path("posts/", views.posts_list, name="posts_list"),
    path('<str:slug>/', views.single_post, name='single_post'),]

views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Post

# Create your views here.

def posts_list(request):
    return render(request=request, template_name="posts/posts_list.html", context={"posts": Post.objects.all})

def single_post(request,slug):
    post = Post.objects.get(slug=slug)
    return render(request=request, template_name="posts/single_post.html", context={"post": post})

templates / posts / posts_list.html - это страница со всеми сообщениями на exmaple.com/posts/

<section class="bg-light py-5" id="aktualnosci">
<div class="container">
    <h1>Informacje o zmianach w prawie podatkowym</h1>
    <div class="divider"></div>
    <p class="text-paragraph pt-3">Lorem ipsum dolor sit amet consectetur adipisicing elit. Ullam iure consectetur accusantium delectus, iusto culpa mollitia eum molestiae at? Ab!</p>
    <div class="row py-3">
        {% for post in posts %}
        <div class="col-lg-6">
            <div class="news-card mb-3">
                <div class="text-center text-white bg-blue d-flex align-items-center news-card-date">
                    <div class="mx-auto news-card-date-body w-75">
                        <i class="far fa-calendar-alt d-none d-block mx-auto"></i>
                        <span class="d-block news-card-date-value mt-1">{{ post.published }}</span>
                    </div>
                </div>
                <div class="news-card-body">
                    <div class="news-card-img">
            <img class="img-fluid" src="{% static 'main/images/126.jpg' %}" alt="">
                    </div>
                    <div class="news-card-content">
                        <div class="news-card-content-inner">
                            <h2>{{ post.title }}</h2>
                            <p class="text-paragraph">{{ post.lead }}</p>
                            <a class="pb-2" href="{{ post.slug }}">Czytaj więcej</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        {% endfor %}
    </div>
</div>

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

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Для этого вам нужно передать сообщение pk

def single_post(request,pk):
    post = Post.objects.get(pk=pk)
    return render(request=request, template_name="posts/single_post.html",{'post':post})

И в шаблоне вы можете получить подробности, подобные этому

<p>{{post.title}}</p>

, а также передать pk в качестве параметра urlподробности в вашем URL

path('posts/<int:pk>',views.single_post,name='single_post')

Вы не указали правильный URL для подробного URL-адреса

<h2>{{ post.title }}</h2>
   <p class="text-paragraph">{{ post.lead }}</p>
   <a class="pb-2" href="{% url 'posts:single_post' post.slug %}">Czytaj więcej</a>
0 голосов
/ 25 октября 2019

Похоже, вы не передаете никакого контекста шаблону "одного поста".

def single_post(request):
    post = Post.objects.get(pk=pk)
    context = {'post': post }

    return render(request, template_name="posts/single_post.html", context)

Тогда в вашем шаблоне single_post.html вы можете легко получить доступ к любому полю пост-модели.

0 голосов
/ 25 октября 2019

Посетите эту страницу для получения дополнительной информации: https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/

from django.views.generic.detail import DetailView


class PostDetailView(DetailView):

    model = Post

URL:

from django.urls import path

from article.views import PostDetailView

urlpatterns = [
    path('<slug:slug>/', PostDetailView.as_view(), name='post-detail'),
]

пример страницы шаблона:

<h1>{{ object.title}}</h1>
<p>{{ object.content }}</p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...