【问题标题】:Django UpdateView generating 'GET' request instead of 'POST'Django UpdateView 生成“GET”请求而不是“POST”
【发布时间】: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&lt;form action="{% url 'article_edit' article.pk %}" method="post"&gt;
  • 那行不通。 :( 按下更新按钮会导致应用程序试图将我带到我的任何 URL 模式中都不存在的“articles/1/edit/None”。在表单中包含操作 url 会导致“GET /articles /2/edit/None HTTP/1.1" 404 3146 在终端中。
  • 如果您尝试其他更新 url 模式会怎样:'/edit/&lt;int:pk&gt;/'
  • 现在它在终端中返回“GET /articles/edit/2/None HTTP/1.1”404 3146”。我不知道为什么,当我声明 url 模式时,它最后会添加“无”。以及为什么,当 html 表单 'method' 属性 = 'post' 时,它会尝试 GET 请求。

标签: python html django


【解决方案1】:

最后只是在models.py中的get_absolute_url函数中简单地省略了一个return语句。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多