python - 当我尝试在 Django 中使用 UpdateView 编辑帖子时出现错误 NoReverseMatch
问题描述
当我单击更新帖子链接时,出现错误: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 字段。您必须将 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
推荐阅读
- javascript - 如何使用 react.js 中的编程路由将道具从子组件(addform)传递到主应用程序组件
- c - 基于数组的搜索功能
- r - ggplot2 :创建一个多面饼图,在第一列之后有一个空白区域
- android - 在活动设备上使用 Android 管理 API 进行完全托管的注册
- php - 从外部修改 Laravel 包中的变量
- vue.js - VueJS在带有createElement的渲染函数中使用VNode?
- javascript - 更新 react js 中的表单并不会跟踪所有道具的状态
- amazon-web-services - 写入 aws s3 存储桶时 Spark 作业失败 -
- reactjs - React 如何在材质 ui 表中固定/显示/张贴带有可见性图标(眼睛)的按钮?
- amazon-web-services - AWS 上的 Lambda 函数在 EC2 关闭之前发送通知