0

我正在尝试做一些看似简单的事情,但我无法弄清楚。与往常一样,django 的复杂性让我感到惊讶……

我的视图生成模型的一个实例,并在上下文中将其“传递”给模板。在该模板上,用户填写表格并提交。这就是接下来应该发生的事情:在页面加载时位于上下文中的对象被稍微修改并再次在上下文中提交(到同一个模板)。但是,我无法获取页面加载时上下文中的对象实例。有可能吗?也许作为隐藏输入?还是有一些花哨的 django 功能?任何其他想法也受到赞赏,甚至是解决方法(这不是一个真正的专业项目,我这样做是为了乐趣和经验)。

如果这个问题很愚蠢,我很抱歉,但我是 django 的新手,我的大脑仍然无法理解所有内容。谢谢你的帮助!

4

3 回答 3

1

您不能将模型(或任何 Python 对象)直接传递到另一个页面。有一些变通方法(会话、序列化程序),但在大多数情况下,这些都不是必需的。

在您的情况下,没有必要甚至不建议传递实际的 Python 对象。Django 为表单处理提供了许多特性和选项。您可能想特别看一下ModelForms,这是一个很好的功能,可以轻松创建允许您直接编辑模型的表单。

于 2013-08-13T16:27:00.280 回答
0

这与 django 无关。这就是网络的运作方式。HTTP 是无状态的。生成页面时,您已完成该任务。模型实例被销毁。

当用户提交表单或以任何其他方式发送修改时,新连接会以新请求和新上下文开始。此时您需要重新实例化要修改的对象。取决于应用程序和模型本身。您可以传递对象的 unique_id(如果有的话),然后在实际上下文中查询它。

于 2013-08-13T16:28:31.510 回答
0

您所指的上下文正是 django 用于呈现模板的内容。上下文中的对象不会在 HTML 响应/请求中传递,它们仅用于为您指定的 HTML 模板生成内容,然后将其作为静态数据传递给 http 响应。

要执行我认为您正在尝试执行的操作,您通常会将您尝试访问的模型实例的 ID 传递给您正在加载的页面的 url,因此在您将模型实例上下文传递给的页面模板上, 你将会拥有:

<a href="{% url 'name_of_next_url' model_instance.id %}">Link to model-specific page</a>

您尝试访问的实例页面的 url 将是

url(r'^next_url/(?P<model_instance_id>\d+)/$', 'views.next_url_view', name='name_of_next_url')

风景:

def next_url_view(model_instance_id):
    model = Model.objects.get(pk=model_instance_id)
    ...

所以现在您可以在后续视图中访问模型实例。

正如其他人所提到的,已经有通用/基于类的视图可以处理大多数这样的事情,但最好先了解背景。

于 2013-08-13T16:37:03.023 回答