首页 > 解决方案 > 将表单数据传递给视图

问题描述

我有以下看法:

视图.py

def PackingListView(request):
    if request.method == "POST":
        form = PackingListForm(request.POST)
        if form.is_valid():
            if 'preview' in request.POST:
                request.session['data'] = form.cleaned_data
                return redirect('myview')
  ....

我想获取数据form并将其传递给下一个视图,并将data变量设置为等于它。这以前是有效的,但是一旦我在这个表单中添加了一个外键,会话就不再工作了,因为它是不可序列化的。我在这里采取什么方法最安全?

视图.py

class myview(View):
    def get(self, request, *args, **kwargs):

        data = request.session.pop('data', {})#this won't work  now

        pdf = render_to_pdf('packlist_preview.html', data)
        return HttpResponse(pdf, content_type='application/pdf')

此外,如果需要 - 这是网址myview

url(r'^myview/', views.myview.as_view(), name='myview'),

标签: pythondjango

解决方案


如果将模型实例替换为其 id,则应该能够序列化数据。

data = form.cleaned_data
# remove object from data dict
related_object = data.pop('related_object')
# add in a reference
data['related_object_id'] = related_object.pk
# now you should be able to serialize object
request.session['data'] = data

然后在下一个视图中,您可以使用其 id 从数据库中获取对象

data = request.session.pop('data', {})
related_object_id = data.pop('related_object_id', None)
if related_object_id:
    try:
        data['related_object'] = RelatedObject.objects.get(pk=related_object_id)
    except RelatedObject.DoesNotExist:
        pass

推荐阅读