【问题标题】:405 Method is not allowed on Django Form POSTDjango Form POST 上不允许使用 405 方法
【发布时间】:2023-03-05 08:20:01
【问题描述】:

每次我单击 POST 表单上的提交按钮以上传 CSV 文件时。我得到一个代码 405 Method not allowed。我已经尝试更改其他导入方法,例如 django_import_export,但仍然得到相同的响应(405)。请帮忙!

这是我的views.py:

class AdvisoryView(TemplateView):
    template_name = 'advisory.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["adv"] = Mobile.objects.all()
        return context

    def mobile_upload(request):
        template = "advisory.html"

        prompt = {
            'order': 'blah'
        }

        if request.method == "GET":
            return render(request, template, prompt)

        csv_file = request.FILES('file')

        if not csv_file.name.endswith('.csv'):
            messages.error(request, 'This is not a csv file')

        data_set = csv_file.read().decode('UTF-8')
        io_string = io.StringIO(data_set)
        next(io_string)
        for column in csv.reader(io_string, delimiter=',', quotechar='|'):
            _, created = Mobile.objects.update_or_create(
                mobile_owner=column[0],
                mobile_number=column[1],
            )
        context = {}
        return render(request, template, prompt)

mobile.html 看起来像这样。我实际上将表单放在了模型表单中。

<div class="modal-body">            
    {% block content %}
    <form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="file">
    <p>Only accepts .csv file</p>
    <button type="submit">Upload</button>
    </form>
    {% endblock content %}
    </div>
    <div class="modal-footer">

而 urls.py 是

from django.urls import path, include
from . import views
from .views import AdvisoryView, HomeView


urlpatterns = [
    path('', HomeView.as_view(), name='home'),
    path('advisory/', AdvisoryView.as_view(), name='advisory'),
]

【问题讨论】:

  • 您能否发布您获得的完整错误回溯(用它编辑您的帖子)?
  • @KJTHoward,我被重定向到 此页面无法正常工作如果问题仍然存在,请联系网站所有者。 HTTP ERROR 405 点击提交后没有插入数据
  • 如果您使用$ python manage.py runserver 0:8090 运行,您应该会在命令行上看到一些输出。你测试了吗?
  • 当我运行 $ python manage.py runserver 时,它响应 200 代码,但是当我执行插入表单时。命令行输出将是“POST /advisory/ HTTP/1.1” 405 0
  • 好的,状态405是http协议的,所以你可能不会从python得到回溯。一件事让我感到困惑:您不应该在上传请求中使用request.method == "GET":。在模板中,您有方法 POST。这在某种程度上不适合。通常不需要在渲染视图中区分请求方法

标签: python django csv


【解决方案1】:

这个答案解释了为什么在 TemplateView 中不允许 POST。 https://stackoverflow.com/a/44859716/11607969

您可能需要将函数 mobile_upload 更改为 post

【讨论】:

  • 我试过了,现在我收到了TypeError: post() takes 1 positional argument but 2 were given [12/Mar/2020 00:44:29] "POST /advisory/ HTTP/1.1" 500 78494
  • 类视图中使用POST的格式为def post(self, request):
  • 您还应该考虑在 post 方法的末尾重定向到成功或错误页面
  • 仍然无法正常工作,我收到'MultiValueDict' object is not callable 错误。我真的在这里呆了将近 4 天哈哈
猜你喜欢
  • 2014-06-27
  • 2021-11-24
  • 2019-07-05
  • 2016-02-15
  • 2014-04-18
  • 2014-05-23
  • 1970-01-01
  • 2018-12-20
  • 2015-11-16
相关资源
最近更新 更多