Джанго - Как создать URL-адрес пули, который работает? - PullRequest
0 голосов
/ 06 марта 2019

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

Это ошибка, которую я получаю:

Reverse for 'blog_post' with no arguments not found. 1 pattern(s) tried: ['blog\\/post/(?P<slug>[-\\w]+)/$']

Django error page

Это моя модель:

class Post(models.Model):
    STATUS_CHOICES = (
    ('draft', 'Draft'),
    ('published', 'Published'),
)

    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique_for_date='publish')
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    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')

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

   def __str__(self):
     return self.title

   def get_absolute_url(self):
      return reverse('blog:post', args=[str(self.slug)])

Просмотр функций:

class BlogHomePageView(ListView):
  model = Post
  template_name = 'blog/index.html'

class PostDetailView(DetailView):
  model = Post
  template_name = 'blog/post.html'
  slug_url_kwarg = 'slug'
  query_pk_and_slug = True

Urlpatterns:

path('', BlogHomePageView.as_view(), name='blog_home'),
re_path(r'post/(?P<slug>[-\w]+)/$', PostDetailView.as_view(), name='blog_post'),

base.html

<!-- Navigation -->
<nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav">
    <div class="container">
        <a class="navbar-brand" href="index.html">Toluwalemi</a>
        <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse"
                data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false"
                aria-label="Toggle navigation">
            Menu
            <i class="fas fa-bars"></i>
        </button>
        <div class="collapse navbar-collapse" id="navbarResponsive">
            <ul class="navbar-nav ml-auto">
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'blog_home' %}">Home</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'blog_about' %}">About</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'blog_post' %}">Sample Post</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'blog_contact' %}">Contact</a>
                </li>
            </ul>
        </div>
    </div>
</nav>

страница сведений:

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

{% block title %}Post{% endblock %}


<!-- Page Header -->
{% block page_header %}
    <div class="post-heading">
        <h1>{{ post.title }}</h1>
        <h2 class="subheading">Problems look mighty small from 150 miles up</h2>
        <span class="meta">Posted by
              <a href="#">{{ post.author }}</a>
              on {{ post.publish }}</span>
    </div>
{% endblock %}

<!-- Post Content -->
<article>
    {% block content %}
        <p>{{ post.body }}</p>

страница списка:

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

{% block title %}Home{% endblock %}

<!-- Page Header -->
{% block page_header %}
    <div class="site-heading">
        <h1>Toluwalemi's Blog</h1>
        <span class="subheading">Official Blog</span>
    </div>
{% endblock %}

<!-- Main Content -->
{% block content %}
    {% for post in object_list %}
        <div class="post-preview">
            <a href="{{ post.get_absolute_url }}">
                <h2 class="post-title">
                    {{ post.title }}
                </h2>

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Если вы посмотрите на свое определение URL, вы увидите, что он ожидает аргумент slug:

re_path(r'post/(?P<slug>[-\w]+)/$', PostDetailView.as_view(), name='blog_post'),

, который, кстати, также может быть выражен как на Django 2.0:

path('post/<slug:slug>/', PostDetailView.as_view(), name='blog_post'),

Теперь, сообщение об ошибке на изображении ясно показывает, что вы вызываете шаблонный тег URL без указанного аргумента, он имеет только

href="{% url 'blog_post' %}"

и аргумент slug отсутствует.

Вам необходимо добавить аргумент slug.

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

0 голосов
/ 07 марта 2019

Итак, ребята, я наконец понял это.Мой URL-адрес пули теперь работает отлично.

Ошибка на самом деле пришла со страницы моего списка.URL для подробного представления не был написан хорошо.Я не включил пространство имен.Поэтому вместо <a href="{{ post.get_absolute_url }}"> оно становится <a href="{% url 'blog:blog_post' post.slug %}"> Я также удалил лишние строки кодов в моих моделях и на странице просмотра.

Вот как это выглядит сейчас.

models.py:

class Post(models.Model):
    STATUS_CHOICES = (
    ('draft', 'Draft'),
    ('published', 'Published'),
)

   title = models.CharField(max_length=200)
   slug = models.SlugField(max_length=200, default="")
   author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
   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')

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

   def __str__(self):
     return self.title

views.py

class BlogHomePageView(ListView):
   model = Post
   template_name = 'blog/index.html'
   context_object_name = 'posts'

class PostDetailView(DetailView):
    model = Post
    template_name = 'blog/post.html'
    context_object_name = 'post'

blog / urls.py:

    urlpatterns = [
      path('', BlogHomePageView.as_view(), name='blog_home'),
      path('post/<slug:slug>/', PostDetailView.as_view(), name='blog_post'),
    ]

страница списка (index.html):

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

    {% block title %}Home{% endblock %}

    <!-- Page Header -->
    {% block page_header %}
        <div class="site-heading">
            <h1>Toluwalemi's Blog</h1>
            <span class="subheading">Official Blog</span>
        </div>
    {% endblock %}

    <!-- Main Content -->
    {% block content %}
        {% for post in posts %}
            <div class="post-preview">
                <a href="{% url 'blog:blog_post' post.slug %}">
                    <h2 class="post-title">
                        {{ post.title }}
                    </h2>
...