【问题标题】:I have a TemplateDoesNotExist error. I can update my models but not delete them?我有一个 TemplateDoesNotExist 错误。我可以更新我的模型但不能删除它们?
【发布时间】:2017-08-18 15:44:29
【问题描述】:

我正在创建我的第一个 Django 站点,该站点到目前为止有一个名为 clients 的应用程序,并且我将模板保存在 project_name/clients/templates/clients 中。

就像标题说的那样,我可以在我的视图文件中使用 UpdateView 更新我的模型客户端的实例,并且我认为我可以使用 DeleteView 以相同的方式删除一个实例,但我得到了前面所述的错误。任何帮助,将不胜感激。我看过其他类似的帖子,但没有任何帮助我解决这个问题

这是我的网址文件:

from django.conf.urls import url
from . import views
app_name = 'clients'

url(r'^$', views.IndexView.as_view(), name='index'),

# /clients/11/... could be any number
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),

# /clients/viewed/
url(r'^viewed/', views.viewed, name='viewed'),

# /clients/add/
url(r'^add/$', views.ClientCreate.as_view(), name='client-add'),

# /clients/3/update/
url(r'^(?P<pk>[0-9]+)/update$', views.ClientUpdate.as_view(), name='client-update'),

# /clients/8/delete/
url(r'^(?P<pk>[0-9]+)/delete/$', views.ClientDelete.as_view(), name='client-delete'),

]

这是我的views.py中的相关类:

from __future__ import unicode_literals
from django.views import generic
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from django.shortcuts import render
from .models import Client


class ClientUpdate(UpdateView):
    model = Client
    fields = ['name', 'age', 'height', 'weight', 
'history_of_head_trauma', 'profession', 'is_athlete', 'email']
    success_url = reverse_lazy('clients:index')


class ClientDelete(DeleteView):
    model = Client
    success_url = reverse_lazy('clients:index')

这是我的 index.html 中的 div,其中包含用于更新和删除的两个按钮:

 <div class="panel-footer">
      <a type="button" class="btn btn-sm btn-success"><i class="glyphicon glyphicon-envelope"></i></a>
          <span class="pull-right">
                <a href="{% url 'clients:client-update' pk=client.id %}" type="button" class="btn btn-small btn-info"><i class="glyphicon glyphicon-edit"></i></a>
                 <a href="{% url 'clients:client-delete' pk=client.id %}" type="button" class="btn btn-small btn-danger"><i class="glyphicon glyphicon-remove"></i></a>

            </span>
 </div>

【问题讨论】:

  • 你的index.html在哪个目录?
  • 在你的问题中包含 IndexView 类
  • 显示完整的TemplateDoesNotExist 错误。

标签: django django-models django-views


【解决方案1】:

由于某些原因,在使用 UpdateView 时,您在 html 中的按钮可能只是一个简单的链接,其中 href 指向正确的 url,在我的情况下,该链接指向我的视图文件中的 ClientUpdate ...

但对于 DeleteView,html 必须在 &lt;form&gt; 中。这是我必须更改才能使其工作的唯一代码。我基本上把表格代替了 &lt;a href="{% url 'clients:client-delete' pk=client.id %}"....&gt;

<div class="panel-footer">
  <a type="button" class="btn btn-sm btn-success"><i class="glyphicon glyphicon-envelope"></i></a>
    <span class="pull-right">
      <a href="{% url 'clients:client-update' pk=client.id %}" type="button" class="btn btn-small btn-info"><i class="glyphicon glyphicon-edit"></i></a>
      <form action="{% url 'clients:client-delete' pk=client.id %}" method="post" style="display: inline;">
          {% csrf_token %}
          <input type="hidden" name="client_id" value="{{ client.id }}"/>
               <button type="submit" class="btn btn-danger btn-small">
                   <span class="glyphicon glyphicon-trash"></span>
                </button>
        </form>
     </span>

【讨论】:

  • 即使您更改索引以提交发布请求,添加缺少的模板也是一个好主意。否则,当用户/机器人直接导航到删除 URL 时,您会收到错误。
  • 请注意,隐藏输入 client_id 不是必需的 - 您已经在表单的 action 中拥有 client_id
  • 鉴于 DeleteView 需要一个表单来确认删除,如果我不想要删除确认表单,不使用从 DeleteView 继承是否“更好”?
【解决方案2】:

默认情况下,DeleteView 显示获取请求的确认页面,并删除发布请求的对象。您需要创建一个模板clients/client_confirm_delete.html(或在视图上设置template_name)来处理GET 请求。有一个示例模板in the docs

<form action="" method="post">{% csrf_token %}
    <p>Are you sure you want to delete "{{ object }}"?</p>
    <input type="submit" value="Confirm" />
</form>

您的另一个选择是向您的索引页面添加一个表单,以便用户向删除页面提交一个发布请求。请注意,这意味着该对象将被立即删除而无需确认。即使您这样做,为 GET 请求添加模板也是一个好主意,否则当用户/机器人直接导航到您的删除 url 时,您可能会收到错误。

【讨论】:

    【解决方案3】:

    你需要在 CBV 中创建一个专用的 HTML 页面来执行删除操作

    【讨论】:

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