Django 1.8 UpdateView 生成 405 错误和空白模板

Posted

技术标签:

【中文标题】Django 1.8 UpdateView 生成 405 错误和空白模板【英文标题】:Django 1.8 UpdateView generates 405 error and blank template 【发布时间】:2015-09-18 10:02:50 【问题描述】:

我是 Python 和 Django 的新手,所以请多多包涵!我正在使用 Django 1.8 和 Python 3 进行编码。

我有以下看法:

class UpdatePart(UpdateView):
    template_name = 'maketen/update_part.html'
    model = Part
    form_class = EditPartForm

这是我的 urls.py:

urlpatterns = [
    url(r'^$', IndexView.as_view(), name='index'),
    url(r'ten/add/$', TenCreate.as_view(), name='ten_create'),
    url(r'update/(?P<pk>[0-9]+)/$', TenUpdate.as_view(), name='tender_update'),
    url(r'delete/(?P<pk>[0-9]+)/$', TenDelete.as_view(), name='tender_delete'),
    url(r'(?P<pk>[0-9]+)/$', TenDetail.as_view(), name='ten_detail'),
    url(r'add_part/$', AddPart.as_view(), name='part_create'),
    url(r'update_part/(?P<pk>[0-9]+)/$', UpdatePart.as_view(), name='part_update'),]

这是我的相关forms.py类:

class EditPartForm(forms.ModelForm):
    class Meta:
        model = Part
        fields = ['part_name', 'part_description', 'ten']

这是我的模板:

<h1>Update a New Part</h1>

<form action="" method="post">
    % csrf_token %
     form.as_p 
    <input type="submit" value="Update Part">
 </form>

编辑:这是两个相关类的 models.py:

class Ten(models.Model):

    def __str__(self):
        return self.ten_name

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.create_date <= now

    def get_absolute_url(self):
        return reverse('maketen:ten_detail', kwargs='pk': self.pk)

    was_published_recently.admin_order_field = 'create_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

    ten_name = models.CharField(max_length=200)
    create_date = models.DateTimeField('date created')


class Part(models.Model):

    def __str__(self):
         return self.part_name

    def get_absolute_url(self):
        return reverse('maketen:ten_detail', kwargs='pk': self.ten.pk)

    ten = models.ForeignKey(Ten)
    part_name = models.CharField(max_length=200)
    part_description = models.CharField(max_length=2000)
    create_date = models.DateTimeField('date created')

我有一个使用 UpdateView (TenUpdate) 的类似类,它运行良好,但是,UpdatePart 生成 405 错误。

我知道 405 是一个发布错误,但我不明白为什么。我查看了我能找到的所有相关问题以及文档,但它们大多与基于函数的视图有关。另外,阅读你还不理解的东西并没有多大帮助:)

我的直觉是它与网址有关,但我不能肯定地说。

有什么想法吗?

【问题讨论】:

这是您的完整网址吗?你能显示完整的回溯吗?它将显示是否是 UpdateView 引发了 405 错误(这将是令人惊讶的),或者是否由于您的 url 中的问题另一个视图正在处理请求。 对不起,我的错误,您没有得到 405 响应的回溯。我同意你的建议,这可能是 urls.py 中的问题,但我没有发现你发布的内容有任何问题。 @Alasdair 我仍处于构建站点的早期阶段,所以没有什么可展示的!但是,是的,没有你所说的回溯,只有控制台给出错误和一个空白模板。 使用浏览器中的开发者工具检查 POST 请求提交到的 URL,并确保它是您所期望的。 @Alasdair 我检查了一下,看起来还不错。我使用一个按钮来调用 UpdateView 并在模板中生成 action="/maketen/update_part/24/" 其中 24 是必须编辑的部分的 pk。我的期望是该按钮会将 pk 传递给该类,然后该类将执行 UpdateView 所做的魔术。使用 UpdateTen,它就像一个魅力。所以它看起来正确但没有骰子。我将模型添加到问题中以防它揭示某些内容。 【参考方案1】:

您需要将 POST 发送到同一个 pk: 在您的模板中:

<h1>Update a New Part</h1>

<form action="% url 'part_update' pk=object.pk %" method="post">
    % csrf_token %
     form.as_p 
    <input type="submit" value="Update Part">
 </form>

同样的事情发生在我身上,这解决了它。

【讨论】:

谢谢,这是很久以前的事了,也学到了同样的教训。我会标记为正确答案。

以上是关于Django 1.8 UpdateView 生成 405 错误和空白模板的主要内容,如果未能解决你的问题,请参考以下文章

Django:仅更新UpdateView中已更改的字段

进阶剖析django通用类UpdateView(2张图)

使用基于类的 UpdateView 在 Django 中更新用户模型

Django 中 UpdateView 上的日期格式更改

Django中的UpdateView显示空白表单而不是数据库以前的数据

url中没有pk的Django UpdateView