Как использовать URL Python Django - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь выучить Python Django с книгой "Example_Build_powerful_and_reliable_Python_web_applications" Антонио Меле. Очень жаль, возможно, глупые вопросы, но я очень новичок. И извините за мой Engli sh, это не мой родной язык.

Возникли проблемы с одним из примеров из книги. Делайте то же самое, что и в книге, но URL не работает.

MODELS.PY

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager, self).get_queryset().filter(status='published')

class Post(models.Model):
    STATUS_CHOICES = (
    ('draft', 'draft'),
    ('published', 'published')
    )
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250,
                            unique_for_date='publish')
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10,
                             choices=STATUS_CHOICES,
                             default='draft')
    objects = models.Manager()
    published = PublishedManager()

class Meta:
    ordering = ('-publish',)

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('blog:post_detail',
                    args=[self.publish.year,
                    self.publish.month,
                    self.day, self.slug])

VIEWS.PY

from django.shortcuts import render, get_object_or_404
from .models import Post

def post_list(request):
        posts = Post.published.all
        return render(request,
                     'blog/post/list.html',
                     {'posts': posts})

def post_detail(request, post):
    post = get_object_or_404(Post, slug = post)
    return render(request, 'blog/post/detail.html', {'post': post})

URLS.PY

from django.urls import path
from . import views

app_name ='blog'

urlpatterns = [
 path('', views.post_list, name='post_list'),
 path('<int:year>/<int:month>/<int:day>/<slug:post>/',
 views.post_detail,
 name='post_detail'),
]

БАЗА. HTML

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>{% block title %} {% endblock %}</title>
  </head>
  <body>
    <div id="content">
      {% block content %}
      {% endblock %}
    </div>
    <div id="sidebar">
      <h2>My Blog</h2>
      <p>This is my blog</p>
    </div>
  </body>
</html>

СПИСОК. HTML

{% extends "blog/base.html" %}

{% block title %}My blog{% endblock%}

{% block content %}
  <h1>My Blog</h1>
    {% for post in posts %}
      <h2>
        <a href="{{ post.get_absolute_url }}">
          {{post.title}}
        </a>
      </h2>
      <p class="date">
        Published {{ post.publish }} by {{ post.author }}
      </p>
        {{ post.body|truncatewords:30|linebreaks }}
      {% endfor %}
    {% endblock %}

ДЕТАЛИ. HTML

{% extends "blog/base.html" %}

{% block title %} {{ post.title }} {% endblock %}

{% block content %}
  <h1> {{ post.title }} </h1>
  <p class = "date">
    Published {{ post.publish }} by {{ post.author }}
  </p>
    {{ post.body|linebreaks }}
  {% endblock %}

Также добавьте мои URL-адреса в URL-адреса здесь: введите описание изображения здесь

Проблема в том, что: когда я нажимаю на сообщения на странице BASE. HTML Я не вижу правильного URL и ничего не происходит: введите описание изображения здесь Действительно сломаю мой мозг. Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

О, боже мой ...

Если кто-то столкнется с той же проблемой ..

В MODELS.PY просто нужно переместить мета-класс и 2 определения:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager, self).get_queryset().filter(status='published')

class Post(models.Model):
    STATUS_CHOICES = (
    ('draft', 'draft'),
    ('published', 'published')
    )
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250,
                            unique_for_date='publish')
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10,
                             choices=STATUS_CHOICES,
                             default='draft')
    objects = models.Manager()
    published = PublishedManager()

    class Meta:
        ordering = ('-publish',)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail',
                    args=[self.publish.year,
                    self.publish.month,
                    self.day, self.slug])

И тогда он будет работать хорошо. Очень глупая ошибка, так трудно это найти ..

0 голосов
/ 18 апреля 2020

Ваш VIEWS.py должен содержать методы post (self, request) ИЛИ get (self, request) для вызова из обработанного HTML. Методы post_list (..) ИЛИ post_detail (..) не могут быть вызваны в рамках Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...