【问题标题】:POSTing data to a django admin form将数据发布到 django 管理表单
【发布时间】:2011-01-12 16:16:14
【问题描述】:

我正在编写一个 Django 应用程序,其数据将来自不同来源,包括 Excel 电子表格。我已经编写了一些代码来从这些工作表中进行初始导入,但我不喜欢每次添加一行时都重新导入整个数据的想法——而且我的客户不想自己重新输入数据.

一种可能的解决方案是添加一个带有简单文本区域的表单,用户可以在其中复制粘贴整行电子表格。然后视图可以拆分数据,对其进行预处理并将其发布到相应对象的标准管理表单中。

理想情况下,它的行为就像用户真的从这个表单发布的那样:如果数据验证,则创建对象,如果没有,则重新显示(管理员)表单,并带有漂亮的红色错误框。

所以我想我只需要类似的东西

from django.shortcuts import redirect
[...]
return redirect(to, method=POST, *args)

但它似乎不可用。

我还考虑将数据作为http://.../admin/app/object/add/?ID=1234&name=toto& 之类的大查询字符串传递...但是我的模型有很多字段,包括一对多和多对多内联,可能是长文本字段等这种方法似乎比必要的麻烦。

知道如何获得类似 POST 重定向的东西吗?还是解决这个问题的其他方法?

【问题讨论】:

标签: python django django-admin


【解决方案1】:

如果您已经在编写特定于您的表单的代码,为什么不在同一个函数中创建对象,而不是尝试向管理站点伪造 POST 请求?

对我来说,使用默认管理表单听起来比使用现有的预处理视图开始创建或更新对象更难。

我只需通过 get_urls 方法将您的预处理视图连接到您的 ModelAdmin 定义,设置一个可以像这样简单的模板

<form action="." method="post">
    <textarea name="data"></textarea>
    <input type="submit" value="submit" />
</form>

并手动处理输入表单request.POST.get('data', '').split(',')(或你有什么)中的数据并开始填充你的模型。

完成后,发送消息并重定向回您的应用视图或更改列表视图。

request.user.message_set.create(message="Finished populating X models")
return http.HttpResponseRedirect('../')

【讨论】:

  • 我应该在哪里“处理输入表单中的数据 request.POST.get('data', '').split(',') ”?
  • @Brent81,你认为你已经迷上了管理员get_urls(链接到帖子中的文档)
【解决方案2】:

为此,您应该远离内置管理界面。

创建您自己的ModelForm http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

创建您自己的执行验证和 POST 的视图函数。

这应该是一个两步交易。

view_function_1

  • 如果方法是 GET,则显示空表单。

  • 如果方法是 POST,他们已将值粘贴到文本框中并填写“其他”字段。

    解析文本框中的数据。

    对于空字段,从文本框中填写缺失值。

    将表单的数据放入会话中。

    重定向到将移动到 view_function_2 的 URL

view_function_2

  • 如果方法是 GET,则从会话中获取表单数据,填写内容并 用数据呈现表单。

  • 如果方法是 POST,验证并保存结果。

    重定向到将向用户显示详细信息的页面。

【讨论】:

    最近更新 更多