我正在尝试做一些看似简单的事情,但我无法弄清楚。一如既往,django以其复杂性令我惊讶......
我的视图生成模型的实例,并在上下文中“将其传递”到模板。在该模板上,用户填写表单并提交。这就是接下来应该发生的事情:当加载页面时,上下文中的对象被稍微修改并再次在上下文中提交(到同一模板)。但是,当页面加载时,我无法获取上下文中对象的实例。有可能吗?也许作为一个隐藏的输入?还是有一些花哨的django功能?任何其他想法也受到赞赏,甚至是变通方法(这不是一个真正的专业项目,我是为了娱乐和体验而做的)。
我很抱歉,如果这个问题很愚蠢,但我是django的新手,我的大脑仍然有理解一切的麻烦。谢谢你的帮助!
答案 0 :(得分:1)
您无法将模型(或任何Python对象)直接传递给其他页面。有解决方法(会话,序列化程序),但在大多数情况下,这些都不是必需的。
在您的情况下,没有必要或甚至建议传递实际的Python对象。 Django为form handling提供了许多功能和选项。您可能需要特别关注ModelForms,这是一个很好的功能,可以轻松创建允许您直接编辑模型的表单。
答案 1 :(得分:0)
这与django无关。这就是网络的运作方式。 HTTP是无状态的。 生成页面时,您已完成该任务。 模型实例被破坏。
当用户提交表单或以任何其他方式发送修改时,新连接将以新请求和新上下文开始。 此时,您需要重新实例化要修改的对象。 取决于应用程序和模型本身。 您可以传递对象的unique_id(如果有),并在查询它的实际上下文中将其恢复。
答案 2 :(得分:0)
您所指的上下文正是django用于呈现模板的内容。上下文中的对象不会在HTML响应/请求中传递,它们仅用于生成您指定的HTML模板的内容,然后将其作为静态数据传递给http响应。
要执行我认为您要执行的操作,您通常会传递您尝试访问要加载的页面的网址的模型实例的ID,因此在您传递模型的页面模板上实例上下文,您将拥有:
<a href="{% url 'name_of_next_url' model_instance.id %}">Link to model-specific page</a>
并且您尝试访问的实例页面的网址将是
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)
...
现在您可以在后续视图中访问模型实例。
正如其他人所提到的,已有基于通用/类的视图可以处理大多数这样的事情,但最好先了解背景。