【问题标题】:After getting a form.cleaned_data from POST how to pass it to another view?从 POST 获取 form.cleaned_data 后如何将其传递给另一个视图?
【发布时间】:2019-08-20 20:10:01
【问题描述】:

正如标题所说:我如何(在 DJANGO 中)从视图中的表单获取数据(在下面的代码中是 ALIMENTA2 视图),然后在另一个基于类的视图(GMO,即使用 easy_pdf 构建的 PDF 报告)?

我是 django 的菜鸟,但我尝试过重定向和渲染……我似乎不太明白我在做什么,真的哈哈哈

views.py

def alimenta2(request):
    if request.method == 'POST':

        form = AlimentaForm(request.POST)

        if form.is_valid():

            day = form.cleaned_data['sign_date']
            shipper = form.cleaned_data['shipper']

            context = {'day': day, 'shipper': shipper}
            #HERE IS THE PROBLEM, I WANT TO PASS THE CONTEXT:
            return redirect('GMO', context=context)

    else: form = AlimentaForm()

    return render(request, 'agroex/alimenta2.html', {'form':form})

class GMO(PDFTemplateView):
    template_name = 'agroex/gmo.html'

    def get_context_data(self, **kwargs):
        context = super(GMO, self).get_context_data(
            pagesize='A4',
            title='NON-GMO Certificate',
            day=self.day,
            **kwargs
        )

urls.py

urlpatterns = [
    path('', views.agroex, name='agroex'),
    path('alimenta2/', views.alimenta2, name='alimenta2'),
    path('alimenta2/GMO/', views.GMO.as_view(), name='GMO'),
]

【问题讨论】:

    标签: django redirect render


    【解决方案1】:

    您可以将变量存储在会话中,然后在另一个视图中检索,如下所示:

    def alimenta2(request):
        if request.method == 'POST':
    
            form = AlimentaForm(request.POST)
    
            if form.is_valid():
    
                day = form.cleaned_data['sign_date']
                shipper = form.cleaned_data['shipper']
    
                request.session['day'] = day
                request.session['shipper_id'] = shipper.id
    
                return redirect('GMO')
    
            else:
                form = AlimentaForm()
                return render(request, 'agroex/alimenta2.html', {'form':form})
    
    class GMO(PDFTemplateView):
        template_name = 'agroex/gmo.html'
    
        def get_context_data(self, **kwargs):
            day = request.session['day']
            shipper_id = self.request.session['shipper_id']
    
            shipper = Shipper.objects.get(id=shipper_id)
    
            context = super(GMO, self).get_context_data(
                    pagesize='A4',
                    title='NON-GMO Certificate',
                    day=day,
                    shipper=shipper,
                    **kwargs
           )
    

    【讨论】:

    • 你好阿尔弗雷多。感谢您的答复。我不了解会话,在阅读了文档和其他资源上的会话之后,它变得更有意义了。此外,我无法计算 TemplateView 类上的 request.session 部分,因为我们需要添加一个 self。在它之前(即 day=self.request.session)。但是,我似乎无法通过此会话过程传递“日期”。有什么解决办法吗?
    • 您可以将日期转换为字符串str(day)。在这里查看一些替代方案link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多