Почему я не могу загрузить свой документ с помощью django? и как это сделать?

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

Это views.py

from django.http import HttpResponse
from django.shortcuts import render
import xlsxwriter
from xlsxwriter import workbook
from django.forms import Form, CharField, ChoiceField, IntegerField
from django.core.validators import MaxValueValidator, MinValueValidator

def home(request):
    return render(request, 'my_app/home.html')

def create_template(request):
    return render(request, 'my_app/create_template.html')

class TemplateForm(Form):
    doc_name = CharField(label='Document name')
    sheetnames = CharField(label='Sheetnames')
    choices = []
    for year in range (1900, 2050):
        choices.append( (year, year) )
    year1 = ChoiceField(label='Starting Year', initial=2021, choices=choices)
    year2 = ChoiceField(label='Ending Year', initial=2022, choices=choices)    
    row_names = CharField(label='Column names')

def create_template(request):
    if request.method == 'GET':
        form = TemplateForm()
        return render(request, 'my_app/create_template.html', {'form':form})
    else:
        form = TemplateForm(request.POST)

def create_form(doc_name, sheetnames, years, row_names):
    workbook = xlsxwriter.Workbook(doc_name + '_template.xlsx')
    worksheet_introduction = workbook.add_worksheet( "introduction" )
    for i in sheetnames:
        worksheet_data = workbook.add_worksheet(i)
        worksheet_data.write_row(0, 1, years)
        worksheet_data.write_column(1, 0, row_names)
    workbook.close()

Это my_app/templates/my_app/create_template.html

{% extends "my_app/base.html" %}
{% block content %}

<form action="create_template" method="GET">
  {% csrf_token %}
  <h1>Create your template</h1>
  <div class="item">
    <table>
      {{ form.as_table }}
    </table>
  </div>
  <div class="btn-block">
    <input type="button" type="submit" value="Create and Download!"/>
  </div>
</form>
{% endblock content %}

Когда вы застряли, лучше всего разбить вещи на части и атаковать их по одной за раз. Я упростил ваш пример, чтобы вы могли получить что-то работающее и расширить его до того, что вам нужно. Начните с Django. Я создал urls.py, в котором по умолчанию был проложен маршрут к home.

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='my-home'),
]

Вызывает функцию home в файле views.py. При первом посещении страницы используется метод GET, который инициализирует форму. Когда вы нажимаете submit, используется метод POST для той же страницы (action="", method="POST"). То же представление вызывается снова, только на этот раз не GET, поэтому вызывается функция create_workbook, которая использует данные формы для сохранения файла. После сохранения она сообщает пользователю имя файла и, если что-то пойдет не так, перенаправляет обратно на страницу формы.

views.py

from django.shortcuts import render, HttpResponse, redirect
import xlsxwriter
from django.forms import Form, CharField, ChoiceField


class TemplateForm(Form):
    doc_name = CharField(label='Document name')
    sheet_name = CharField(label='Sheetname')
    choices = []
    for year in range(1900, 2050):
        choices.append((year, year))
    year1 = ChoiceField(label='Starting Year', initial=2021, choices=choices)
    year2 = ChoiceField(label='Ending Year', initial=2022, choices=choices)


def home(request):
    if request.method == 'GET':
        form = TemplateForm()
        return render(request, 'my_app/create_template.html', {'form': form})
    else:
        form = TemplateForm(request.POST)
        if form.is_valid():
            create_workbook(form.cleaned_data.get('doc_name'), form.cleaned_data.get('sheet_name'), form.cleaned_data.get('year1'), form.cleaned_data.get('year2'))
            return HttpResponse(f"saved workbook to {form.cleaned_data.get('doc_name')}_template.xlsx")
        return redirect('my-home')


def create_workbook(doc_name, sheet_name, year1, year2):
    workbook = xlsxwriter.Workbook(doc_name + '_template.xlsx')
    worksheet = workbook.add_worksheet(sheet_name)
    row = 0
    col = 0
    year1 = int(year1)
    year2 = int(year2)
    if year1 <= year2:
        years = range(year1, year2)
    else:
        years = range(year2, year1)
    for i in years:
        worksheet.write(row, col, i)
        row += 1
    workbook.close()

my_app/base.html

<html>
<head>

</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>

my_app/create_template.html

{% extends "my_app/base.html" %}
{% block content %}

<form action="" method="POST">
  {% csrf_token %}
  <h1>Create your template</h1>
  <div class="item">
    <table>
      {{ form.as_table }}
    </table>
  </div>
  <div class="btn-block">
    <input type="submit" value="Create and Download!"/>
  </div>
</form>
{% endblock content %}

Example output Надеюсь, этот рабочий пример поможет.

Вернуться на верх