如何在 Django 中 运行 像 class 这样的 python 脚本?

How to run a python script like class in django?

我对 django 有点陌生,我迷路了,我不知道该怎么做。我会解释我想要什么,也许你能帮我。

我想在我的网站上创建一个网页,您可以在其中输入您的数据,然后根据您的数据创建一个 excel 模板供您下载。最基本的是,您输入行和列的名称,然后下载一个 excel 文档。

这是我到目前为止尝试过的...我有一个 my_django 文件夹和 my_app 文件夹,在 my_app 我正在尝试创建一个应用程序来创建模板.

这是my_app/views.py

from django.shortcuts import render
from django.http import HttpResponse
from .forms import TemplateForm
import xlsxwriter
from xlsxwriter import workbook

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

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

class CreateMyWebTemplate():
    def create_template(doc_name, name_sheet, years, name_columns):
        file = xlsxwriter.Workbook(doc_name + '_template.xlsx')
        worksheet_data = file.add_worksheet()
        worksheet_data.write_row(0, 1, years)
        worksheet_data.write_column(1, 0, name_columns)
        file.close()
        return file

这是my_app/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='my-home'),
    path('create-template/', views.create_template, name='my-create-template'),
]

这是my_app/forms.py

from django import forms

class CreateMyWebTemplate(forms.Form):
    doc_name = forms.CharField()
    name_sheet = #selectedcountry
    years = #listfromweb
    name_rows = #imputed column names

这是my_app/template/my_app/create_template.html

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

<div class="create-template-box">
      <form action="/">
        <h1>Create your template</h1>
        <div class="item">
          <p>Document name</p>
          <div class="name-item">
            <input type="text" name="doc_name" placeholder="Input document name without spaces" />
          </div>
        </div>
        <div class="item">
          <p>Select a country for the name of sheet</p>
            <select name="name_sheet">
              <option value="">Country</option>
              <option value="1">Russia</option>
              <option value="2">Germany</option>
              <option value="3">France</option>
              <option value="4">Armenia</option>
              <option value="5">USA</option>
            </select>
          </div>
        </div>
        <div class="item" name="years">
          <p>Select a years for columns</p>
            <p> Start: </p> <select name="yearpicker" id="yearpicker"></select>
            <br>
            <p>End: </p> <select name="yearpicker2" id="yearpicker2"></select>
        </div>
        <div class="item">
          <p>Please input a names of rows... seperate with commas</p>
          <input type="text" name="name_rows"/>
        </div>
        <div class="btn-block">
          <button type="submit" href="#">Create and Download!</button>
        </div>
      </form>
    </div>

<script type="text/javascript"
        src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"> 
</script>
<script type="text/javascript">
let startYear = 1800;
let endYear = new Date().getFullYear();
for (i = endYear; i > startYear; i--)
{
    $('#yearpicker, #yearpicker2').append($('<option />').val(i).html(i));
}

$('select').on('change', function(){
  let arr = Array.from({length:$('#yearpicker2').val() - +$('#yearpicker').val()},(v,k)=>k + +$('#yearpicker').val())
  console.log(arr);
})
</script>
{% endblock content %}

my_django 中应用包含在 settings.py 和 urls.py

对于您的 create_template 视图,您可以处理 HTTP GET 和 HTTP POST 方法。您还可以使用 Django 的内置表单处理来简化此过程。

新建create_template.html

...
          <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>
...

views.py

的新内容
        from   django.forms import Forn, CharField, ChoiceField, IntegerField, 
        ...
    
            class TemplateForm(Form):
               name = CharField(label='Doc name')
               choices=[('1', 'Russia'), ('2', 'Germany'), ('3', 'France'),
                        ('4', 'Armenia'), ('5', 'USA')]
               country = ChoiceField(label='name_sheet', initial='5', choices=choices)
               choices = []
               for year in range (2000, 2050):
                   choices.append( (year, year) )
               year1 = ChoiceField(label='Starting Year', initial=2021, choices=choices)
               year2 = ChoiceField(label='Ending Year', initial=2022, choices=choices)
               columns = 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)
                    <use form inputs as needed>
    ...