【问题标题】:An error NoReverseMatch appears when I try to edit a post using UpdateView in Django当我尝试在 Django 中使用 UpdateView 编辑帖子时出现错误 NoReverseMatch
【发布时间】:2021-10-23 07:42:40
【问题描述】:

当我点击更新帖子链接时,会出现错误:Reverse for 'post_detail' with no arguments not found。尝试了 1 种模式:['post/(?P[-a-zA-Z0-9_]+)$']。

我的 Post 模型如下所示:

class Post(models.Model):
    title = models.CharField(max_length=200, verbose_name='Заголовок')
    slug = AutoSlugField(populate_from=['title'])
    title_image = models.ImageField(upload_to=user_img_directory_path, blank=True, verbose_name='Изображение')
    description = models.TextField(max_length=500, verbose_name='Описание')
    body = FroalaField(options={
        'attribution': False,
    }, verbose_name='Текст')
    post_date = models.DateTimeField(auto_now_add=True, verbose_name='Дата публикации', db_index=True)
    post_update_date = models.DateTimeField(auto_now_add=True, verbose_name='Дата обновления публикации')
    post_status = models.BooleanField(default=True, verbose_name='Опубликовано')

    class Meta:
        ordering = ['-post_date']

    def get_absolute_url(self):
        return reverse('articles:post_detail', kwargs={'slug': self.slug})

    def __str__(self):
        return self.title

views.py 中我的 DetailView 和 UpdateView 类:

from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView

class PostDetail(DetailView):
    model = Post
    template_name = 'articles/post_detail.html'
    context_object_name = 'post'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

class UpdatePost(UpdateView):
    model = Post
    template_name = 'articles/update_post.html'
    fields = ['title', 'title_image', 'description', 'body']

我的 urls.py 文件:

from .views import PostsList, PostDetail, CreatePost, UpdatePost

app_name = 'articles'

urlpatterns = [
    path('', PostsList.as_view(), name='posts_list'),
    path('post/<slug:slug>', PostDetail.as_view(), name='post_detail'),
    path('create/', CreatePost.as_view(), name='create_post'),
    path('post/edit/<slug:slug>', UpdatePost.as_view(), name='update_post'),
]

update_post.html 模板如下所示:

{% extends 'layout/basic.html' %}

{% load static %}
{% load django_bootstrap5 %}

{% block content %}
<form method="post" class="form">
    {% csrf_token %}
    {{ form.media }}
    {% bootstrap_form form %}
    {% bootstrap_button button_type="submit" content="Обновить" %}
</form>

<a class="btn btn-outline-primary" href="{% url 'articles:post_detail' %}" role="button">Назад</a>

{% endblock %}

post_detail.html 中的 update_post 链接如下所示:

<a class="btn btn-outline-primary" href="{% url 'articles:update_post' post.slug %}" role="button">Обновить</a>

请告诉我如何解决这个问题?

【问题讨论】:

  • 发布细节需要一个 slug,所以 django 不知道你在锚标签中要指向的目标是什么
  • @Sayse,如何将 slug 添加到帖子详细信息视图?
  • 我不知道你希望从哪里得到蛞蝓

标签: python django django-views django-forms django-templates


【解决方案1】:

早上好,问题是模板无法访问 slug 字段。您必须将 slug 注入上下文:

class UpdatePost(UpdateView):
    model = Post
    template_name = 'articles/update_post.html'
    fields = ['title', 'title_image', 'description', 'body']
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['slug'] = self.object.slug
        return context

【讨论】:

  • 谢谢!你的评论对我帮助很大!我还想说update_post.html中的链接需要稍微改一下:&lt;a class="btn btn-outline-primary" href="{% url 'articles:post_detail' post.slug %}" role="button"&gt;Назад&lt;/a&gt;
猜你喜欢
  • 2017-07-27
  • 2020-02-27
  • 2018-02-19
  • 1970-01-01
  • 2021-03-07
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多