Как можно выполнить две функции соответственно в Django? - PullRequest
0 голосов
/ 29 апреля 2020

Я использовал код, подготовленный в https://www.pythoncircle.com/, чтобы импортировать и экспортировать файл Excel, используя Django. Этот код представлен ниже:

from Django.shortcuts import render
import openpyxl

views.py file:
def index(request):
    if "GET" == request.method:
        return render(request, 'myapp/index.html', {})
    else:
        excel_file = request.FILES["excel_file"]

        wb = openpyxl.load_workbook(excel_file)

        worksheet = wb["Sheet1"]
        print(worksheet)

        excel_data = list()
        for row in worksheet.iter_rows():
            row_data = list()
            for cell in row:
                row_data.append(str(cell.value))
            excel_data.append(row_data)

        return render(request, 'myapp/index.html', {"excel_data":excel_data})

import xlwt
from django.http import HttpResponse


def download_excel_data(request):
    response = HttpResponse(content_type='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename="ThePythonDjango.xls"'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet("sheet1")
    row_num = 0

    font_style = xlwt.XFStyle()
    font_style.font.bold = True


    columns = ['Column 1', 'Column 2', 'Column 3', 'Column 4', ]
    for col_num in range(len(columns)):
        ws.write(row_num, col_num, columns[col_num], font_style)

    # Sheet body, remaining rows
    font_style = xlwt.XFStyle()


    wb.save(response)
    return response

urls.py file:
from django.urls import path
from django.http import HttpResponse

from . import views

app_name = "myapp"


urlpatterns = [

    path('', views.index, name='index'),
    path('', views.download_excel_data, name='download_excel_data'),

]

Когда я запускаю описанный код, выполняется только функция индекса. в то время как при изменении urlpatterns на: urlpatterns = [

    path('', views.download_excel_data, name='download_excel_data'),
    path('', views.index, name='index'),    
]

выполняется функция download_excel_data. Как я могу выполнить обе функции соответственно? Заранее спасибо

1 Ответ

0 голосов
/ 29 апреля 2020

Когда DJANGO ищет URLS.py, он ищет первое совпадение. Когда он находит совпадение, поиск заканчивается, и он выполняет функцию, вызванную в URL. Вы можете использовать это поведение в своих интересах, когда используете приложения Frontend, такие как Vue или React.

Так что, когда у вас есть индекс, сначала DJANGO сопоставляет URL с индексом и оправдывает представление индекса. Когда вы сначала изменяете их с помощью download_excel_data, сначала выполняется сопоставление, поэтому выполняется.

Если вы хотите, чтобы они оба выполнялись вместе, возможно, проще всего объединить их в одно представление.

Стилистически, python Импорт обычно находится в верхней части файла для всех функций ниже. Просто кажется странным видеть операторы import между функциями. Существует целая куча соглашений для python, включенных в PEP8 , если вам интересно.

Резюме: объедините их в одном представлении.

...