【问题标题】:Django - How to get checked objects in template checkboxes?Django - 如何在模板复选框中获取选中的对象?
【发布时间】:2021-02-01 01:22:36
【问题描述】:

我是 Django 新手, 我正在使用 xhtml2pdf 将数据对象从模板渲染到 PDF 文件,并且我希望允许用户仅通过复选框将选中的对象渲染到 pdf 中,是否有在 Django 中过滤它?

谢谢

views.py:

def render_to_pdf(template_src, context_dict={}):
    template = get_template(template_src)
    html = template.render(context_dict)
    result = BytesIO()
    pdf = pisa.pisaDocument(BytesIO(html.encode('ISO-8859-1')), result, link_callback=link_callback)
    if pdf.err:
        return HttpResponse('Error')
    return HttpResponse(result.getvalue(), content_type='application/pdf')



class ViewPDF(View):
    @method_decorator(login_required(login_url='livraison:login_page')) 
    def get(self, request, *args, **kwargs):
        checked_objects = [i dont know how to get them]
        queryset = Livraison.objects.filter(id__in=[checked_objects])  # i want something does that
        data = {
            'livraisons' : queryset,  
            'now' : f'Livraisons-{date.today()}'  
        }
        pdf = render_to_pdf('pdf_template.html', data)
        return HttpResponse(pdf, content_type='application/pdf')  

【问题讨论】:

  • 检查这个帖子stackoverflow.com/questions/47245598/…希望它会有所帮助
  • @KumarSinha request.POST.getlist 我之前尝试过,它没有返回任何我认为的结果,因为 GET 方法用于此功能,无论如何感谢您的评论

标签: python html django web-development-server


【解决方案1】:

**

更新

**

我找到了解决方案,我使用 Ajax 代码收集每个选定的对象

 // check selected objects (#pdf is the id of the button which gonna generate the pdf file)
            $('#pdf').click(function () {
                var id = [];

                $(':checkbox:checked').each(function (i) {
                    id[i] = $(this).val()
                })
                if (id.length === 0) {
                    alert('Please Select something..');
                } else {
                    $.ajax({
                        url: '.',
                        method: 'GET',
                        data: {
                            id,
                        },
                        success: function (response) {
                            console.log('PDF is ready')
                        }
                    })
                }

            });

然后我将变量添加到视图函数中以收集所选对象并过滤查询集

myFunction.selected_ones = request.GET.getlist('id[]')

然后在 generate_pdf_func 中过滤查询集

queryset = MODEL.objects.filter(id__in=[x for x in myFunction.selected_ones if x != '0'])

注意: 在您想全选时很重要,因为它返回 0 并且您在数据库中没有任何 id = 0

【讨论】:

    【解决方案2】:

    使用表单获取用户数据。

    class LivraisonSelectForm(forms.Form):
       livraison = forms.ModelChoiceField(label='select', queryset=Livraison.objects.all(), widget=forms.CheckboxInput())
    

    然后在你的视图中使用它:

    class ViewPDF(FormView):
        form_class = LivraisonSelectForm
        template_name = 'path_to_template_with_html_to_filter_data'
    
        @method_decorator(login_required(login_url='livraison:login_page')) 
        def form_valid(self, form):
            checked_objects = form.cleaned_data.get('livraison', [])
            queryset = Livraison.objects.filter(id__in=checked_objects)  # i want something does that
            data = {
                'livraisons' : queryset,  
                'now' : f'Livraisons-{date.today()}'  
            }
            pdf = render_to_pdf('pdf_template.html', data)
            return HttpResponse(pdf, content_type='application/pdf')  
    

    别忘了在你的html中显示这个表单{{ form }}

    【讨论】:

    • forms 没有 ModelSelectField ?!我已经使用了表单code class LivraisonForm(forms.ModelForm): class Meta: model = Livraison exclude = ('checked',)
    • 我不好,它叫ModelChoiceField。答案改变了
    • 我是否完全改变了我的表单类?!
    • 如果您的问题中没有包含您的表单(并查看生成选择的视图),我怎么能确定?
    • 我现在将继承类从 View 更改为 FormView 并且它不返回任何数据..
    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2016-12-04
    • 1970-01-01
    • 2013-08-31
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多