how to use Django filtered class data to 2 seperate view

被刻印的时光 ゝ 提交于 2020-12-26 04:26:40

问题


I am using Django filter and using it in normal view it is working as expected now I want to download the filtered data so for this I am writing one download view where I am trying to use the same FilterClass but no luck. It is giving me an ERROR(Exception Value:
type object 'CTSFilter' has no attribute 'values_list'
). Can anyone please help/suggest how to use filtered queryset in filter class more than one view OR pass the data of filtered query to the download views.

Please find my code.

filters.py

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

Here I want when the user will select Shift_timing for example Morning he will get 10 records so the same data I want to pass to the below download view. (For this I am using CTSFilter class but no luck.)

Please find the below download code(View).

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

Note: If I am Hardcoding it it is working for example.

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

so above code give me all result where Shift timing is morning but I want to do it dynamically bypassing filtered class data. Any help on this would be highly appreciable.

+Adding my View(render which is showing page content)

  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})

Note: If I will keep my same URL (retrievecta_view)then download view is working but separately it is not working.

@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

Code I am using for pagination and returning filter querystring.

{% 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 %}

来源:https://stackoverflow.com/questions/65378255/how-to-use-django-filtered-class-data-to-2-seperate-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!