我正在编写一个Django应用程序,其数据将来自不同的来源,包括Excel电子表格。我已经编写了一些代码来从这些工作表进行初始导入,但我不喜欢每次添加行时重新导入整个数据的想法 - 我的客户端不希望自己重新输入数据
一种可能的解决方案是添加一个带有简单文本区域的表单,用户可以在其中复制粘贴电子表格的整行。然后,视图可以拆分数据,对其进行预处理并将其发布到相应对象的标准管理表单中。
理想情况下,它的行为就像用户真正从这个表单中发布的那样:如果数据验证,则创建对象,如果没有,则会使用漂亮的红色错误框重新显示(admin)表单。
所以我想我只需要像
这样的东西from django.shortcuts import redirect
[...]
return redirect(to, method=POST, *args)
但似乎没有。
我还想过将数据作为像http://.../admin/app/object/add/?ID=1234&name=toto&这样的大查询字符串传递...但我的模型有很多字段,包含一对多和多对多内联,可能是长文本字段等所以这种做法似乎比必要的麻烦更多。
知道如何获得类似POST重定向的内容吗?或另一种解决这个问题的方法?
答案 0 :(得分:2)
如果您已经编写了特定于表单的代码,为什么不在同一个函数中创建对象,而不是试图伪造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('../')
答案 1 :(得分:1)
为此,您应该离开内置管理界面。
创建自己的ModelForm
http://docs.djangoproject.com/en/dev/topics/forms/modelforms/
创建自己的视图函数,进行验证和POST。
这可能是一个两步交易。
view_function_1
如果方法是GET,则显示空格式。
如果方法是POST,他们会将一个值粘贴到文本框中并填入“其他”字段。
解析文本框中的数据。
对于空白字段,请从文本框中填写缺失值。
将表单的数据放入会话中。
重定向到将移至view_function_2
view_function_2
如果方法是GET,则从会话中获取表单数据,填写内容和 用数据提供表格。
如果方法是POST,请验证并保存结果。
重定向到一个页面,该页面会向用户显示详细信息。
答案 2 :(得分:1)
感谢您快速而翔实的答案!
@Yuji - 我之所以想使用管理表单(或任何ModelForm)的原因主要是错误报告:数据可能包含错误并开发报告信息的方式,本地化为5不同的语言对我来说似乎不太干,因为管理员应用程序中已存在非常好的东西。
@S。 Lott - 我曾想过用ModelForm替换管理员,但缺少的部分是将表单数据存储在会话中的想法。这似乎是一种非常有前景的方法。我会尝试并回到这里报告它是如何发生的。