Как экспортировать отображение информации в таблицу в Excel Django - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу экспортировать отображение информации в шаблоне под тегом таблицы в Excel.Я уже пытался реализовать код, но теперь он экспортирует информацию.

Это мой шаблон:

<div id="info" style="padding-left: 130px">
 <table class="table table-hover" style="width: 1200px;">
<thead>
     <tr><th> Student Name</th>
     <th> Attendance Mark </th>
     </tr>
</thead>
<tbody>
    {% for student in students %}
    <tr><td>{{student.studName__VMSAcc}}</td>
        <td>{{student.mark}}</td>
        </tr>   
    {% endfor %}
</tbody>
  </table>
  <a href="{% url 'exportdata' %}">export data</a>
  </div>

Мой View.py

 #to display the attended students in the table form
 def attStudName(request):

students = MarkAtt.objects.values('studName__VMSAcc').annotate(mark=Sum('attendance'))
if (mark): 
    ttlmark = (mark/200) *100
    context = {
    'students' : students,
    'ttlmark': ttlmark
    }
return render(request,'show-name.html',context)


#to extract the infomation displayed in the table.
def file_load_view(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="report.csv"'
    writer = csv.writer(response)
    writer.writerow(['Student Name', 'Attendance'])

    students = MarkAtt.objects.values('studName__VMSAcc').annotate(mark=Sum('attendance'))

    #convert the students query set to a values list as the writerow expects a list/tuple
    students = students.values_list('studName__VMSAcc', 'attendance')

    for student in students:
        writer.writerow(student)
    return response

Мой URLS.py

 url(r'^export/csv/$', views.file_load_view, name="export_data")

Выше мое обновление при поддержке Marcell.Мне удалось экспортировать необходимые данные.Мой вопрос: мне разрешено использовать оператор if-else в моем views.py?То, что я пытаюсь сделать, это конвертировать знак в процентах.Если у учащихся 200 баллов, он будет отображать 100%, если 100 баллов, то 90% или около того.

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Прежде всего, словарь report_line ссылается на переменную student, которая не существует в области действия метода.Исходя из вашего вопроса здесь Я предполагаю, что вы хотите экспортировать данные, отображаемые в вашем шаблоне.

Также я бы порекомендовал обновить текущий вопрос полным набором кодов.

Чтобы добиться этого, вы можете сделать что-то вроде этого:

import csv

from django.http import HttpResponse

def file_load_view(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachement; filename="report.csv"'

    writer = csv.writer(response)
    writer.writerow(['Student Name', 'Attendance'])

    students = MarkAtt.objects.values('studName__VMSAcc').annotate(mark=Sum('attendance'))

    # Note: we convert the students query set to a values_list as the writerow expects a list/tuple       
    students = students.values_list('studName__VMSAcc', 'mark')

    for student in students:
        writer.writerow(student)

    return response

Ваш URL будет выглядеть примерно так:

 url(r'^export/csv/$', views.file_load_view, name='export_data')

В вашем шаблоне:

<a href="{% url 'export_data' %}">Export Data</a>

Это для экспорта данных в файл csv.Глядя на ваше расширение имени файла, кажется, что это поведение, которое вы ищете.Если вы хотите экспортировать в excel файл, я бы порекомендовал посмотреть стороннюю библиотеку, например xlwt

1 голос
/ 19 сентября 2019

См. Приведенный ниже пример для экспорта данных в формате CSV:

import csv
from django.http import HttpResponse

def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'

    writer = csv.writer(response)
    writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
    writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])

    return response

Вы можете изменить свой код, как в примере выше.В официальном документе django есть больше примеров, см. ссылку .

0 голосов
/ 19 сентября 2019

Вы можете использовать django-tables2 .Установите его и добавьте в INSTALLED_APPS.Вам также необходимо установить tablib для функции экспорта.Создайте файл tables.py в папке вашего приложения:

import django_tables2 as tables
from .models import Student

class StudentTable(tables.Table):
    export_formats = ['xls', 'xlsx', 'csv']  # a list of formats you'll like to export to
    class Meta:
        model = Student
        fields = ('name', 'mark')
        # There are more Meta attributes you can use, just look for them in the docs.

Затем используйте класс SingleTableView с ExportMixin в вашем views.py:

from django_tables2.views import SingleTableView
from django_tables2.export.views import ExportMixin
from .models import Student
from .tables import StudentTable

class StudentList(ExportMixin, SingleTableView):
    model = Student
    table_class = StudentTable
    export_name = 'students_assistance'
    template_name = 'students/student_list.html'

Наконец, ваш student_list.html шаблон должен выглядеть так:

{% load django_tables2 %}
<div>
  {% for format in table.export_formats %}
    <a href="{% export_url format %}">.{{ format }}</a>
  {% endfor %}
</div>
{% render_table table %}

С django-tables2 вы можете сделать гораздо больше, это просто базовая реализация.Вы также можете комбинировать его с django-filter .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...