【发布时间】:2021-10-20 16:27:13
【问题描述】:
我正在关注一本名为 Django for Beginners 的书,并创建了一个显示报纸文章的项目。部分功能是能够编辑这些文章。我已尽可能密切关注,但在点击“更新”按钮时仍然出现错误:
我的 urls.py
from django.urls import path
from .views import (ArticleListView,
ArticleUpdateView,
ArticleDetailView,
ArticleDeleteView)
urlpatterns = [
path('<int:pk>/edit/', ArticleUpdateView.as_view(), name = 'article_edit'),
path('<int:pk>/', ArticleDetailView.as_view(), name = 'article_detail'),
path('<int:pk>/delete/', ArticleDeleteView.as_view(), name = 'article_delete'),
path('', ArticleListView.as_view(), name = 'article_list'),
]
我的意见.py
from django.shortcuts import render
from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Article
# Create your views here.
class ArticleListView(ListView):
model = Article
template_name = 'article_list.html'
class ArticleDetailView(DetailView):
model = Article
template_name = 'article_detail.html'
class ArticleUpdateView(UpdateView):
model = Article
fields = ('title', 'body')
template_name = 'article_edit.html'
class ArticleDeleteView(DeleteView):
model = Article
template_name = 'article_delete.html'
success_url = reverse_lazy('article_list')
我的models.py:
from django.db import models
from django.conf import settings
from django.contrib.auth import get_user_model
from django.urls import reverse
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=225)
body = models.TextField()
date = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE,
)
def __str__(self):
return self.title
def get_absolute_url(self):
reverse('article_detail', args=[str(self.id)])
我的 HTML:
<!-- templates/article_edit.html -->
{% extends 'base.html' %}
{% block content %}
<h1>Edit</h1>
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}\
<button class="btn btn-info ml-2" type="submit">Update Article {{article.pk}}</button>
</form>
{% endblock content %}
点击编辑按钮后,根据这本书,应用程序应该将我转发到“article_detail”页面,但是这并没有发生。
我们将不胜感激。
谢谢 安迪
【问题讨论】:
-
在您的表单中设置操作
url:<form action="{% url 'article_edit' article.pk %}" method="post"> -
那行不通。 :( 按下更新按钮会导致应用程序试图将我带到我的任何 URL 模式中都不存在的“articles/1/edit/None”。在表单中包含操作 url 会导致“GET /articles /2/edit/None HTTP/1.1" 404 3146 在终端中。
-
如果您尝试其他更新 url 模式会怎样:
'/edit/<int:pk>/' -
现在它在终端中返回“GET /articles/edit/2/None HTTP/1.1”404 3146”。我不知道为什么,当我声明 url 模式时,它最后会添加“无”。以及为什么,当 html 表单 'method' 属性 = 'post' 时,它会尝试 GET 请求。