如何使用Django筛选的类数据进行2个单独的视图

2024-09-26 22:09:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Django filter,并在普通视图中使用它,它正在按预期工作,现在我想下载过滤后的数据,因此为此,我正在编写一个下载视图,其中我尝试使用相同的FilterClass,但没有运气。它给了我一个错误(异常值:
类型对象“CTSFilter”没有属性“values\u list”
)。 任何人都可以帮助/建议如何在filter类中使用filtered queryset多个视图,或者将filtered query的数据传递给下载视图

请找到我的密码

过滤器.py

class CTAFilter(django_filters.FilterSet):
    id = django_filters.NumberFilter(label="DSID")
    class Meta:
        model = CTA
        fields = ['id', 'EmailID','id','Shift_timing']

在这里,我想当用户将选择Shift\u timing时,例如早晨,他将获得10条记录,因此我希望将相同的数据传递到下面的下载视图。(为此,我使用了CTSFilter类,但运气不佳。)

请查找以下下载代码(查看)

def exportcts_data(request):
    response = HttpResponse(content_type='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename="CTA_ShiftTiming.xls"'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('CTS_ShiftChange Data') # this will make a sheet named Users Data
    # Sheet header, first row
    row_num = 0
    font_style = xlwt.XFStyle()
    font_style.font.bold = True
    columns = ['id','idk','Shift_timing','EmailID','Vendor_Company','Project_name','SerialNumber','Reason','last_updated_time']
    for col_num in range(len(columns)):
        ws.write(row_num, col_num, columns[col_num], font_style) # at 0 row 0 column
    # Sheet body, remaining rows
    font_style = xlwt.XFStyle()
    # cts_list = CTA.objects.all()
    # cts_filter = CTAFilter(request.GET, queryset=cts_list)
    # allcts = cts_filter.qs
    rows = CTAFilter.values_list('id', 'idk', 'Shift_timing', 'EmailID', 'Vendor_Company', 'Project_name',
                              'SerialNumber', 'Reason', 'last_updated_time')
    for row in rows:
        row_num += 1
        for col_num in range(len(row)):
            ws.write(row_num, col_num, row[col_num], font_style)
    wb.save(response)
    return response

注意:如果我是硬编码,它就是工作的例子

 rows = `TCA.objects.filter(Shift_timing__exact='Morning').values_list('id','idk','Shift_timing','EmailID','Vendor_Company','Project_name','SerialNumber','Reason','last_updated_time')`

所以上面的代码给了我所有的结果,其中轮班时间是早上,但我想动态地绕过过滤的类数据。 这方面的任何帮助都是非常值得赞赏的

+添加我的视图(显示页面内容的渲染)

  def retrievecta_view(request):
        if request.method == 'GET':
            allcta = CTA.objects.all()
            allcta1 = allcta
            allctagen = allcta1.filter(Shift_timing__exact='General')
            allctamor = allcta1.filter(Shift_timing__exact='Morning')
            allctseve = allcta1.filter(Shift_timing__exact='Evening')
            allctatotal = allcta1.filter(Shift_timing__exact='Total')
    
            # For filtering using   'django_filters',
            cta_list = CTA.objects.all()
            cta_filter = CTAFilter(request.GET, queryset=cta_list)
            allcta = cta_filter.qs
    
            paginator = Paginator(allcta, 50)
            page_number = request.GET.get('page')
            try:
                allcts = paginator.page(page_number)
            except PageNotAnInteger:
                allcts = paginator.page(1)
            except EmptyPage:
                allcts = paginator.page(paginator.num_pages)
            return render(request, 'abcd/cta.html', {'allcta': allcta, 'cta_filter': cta_filter, 'allcta1': allcta1,
                                                      'allctagen': allctagen, 'allctamor': allctamor,
                                                      'allctaeve': allctaeve,
                                                      'allctatotal': allctatotal})

注意:如果我将保留相同的URL(retrievecta_视图),则下载视图可以正常工作,但单独来看它不工作

@register.simple_tag
def relative_url(value, field_name, urlencode=None):
    url = '?{}={}'.format(field_name, value)
    if urlencode:
        querystring = urlencode.split('&')
        filtered_querystring = filter(lambda p: p.split('=')[0] != field_name, querystring)
        encoded_querystring = '&'.join(filtered_querystring)
        url = '{}&{}'.format(url, encoded_querystring)
    return URL

我用于分页和返回筛选器查询字符串的代码

{% load apple_extras%} {% if page.has_other_pages %} <ul class="pagination"> {% if page.has_previous %} <li class="disabled"><a href="?page={{ page.previous_page_number }}">&laquo;</a></li> {% else %} <li class="disabled"><span>&laquo;</span></li> {% endif %} {% for i in page.paginator.page_range %} {% if page.number == i %} <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li> {% else %} <li> <a href="{% relative_url i 'page' request.GET.urlencode %}">{{ i }}</a> </li> {% endif %} {% endfor %} {% if page.has_next %} <li class="disabled"><a href="?page={{ page.next_page_number }}">&raquo;</a></li> {% else %} <li class="disabled"><span>&raquo;</span></li> {% endif %} </ul> {% endif %}

Tags: 视图idshiftrequestpagelifilternum

热门问题