【问题标题】:How to run a python script like class in django?如何在 django 中运行类似于类的 python 脚本?
【发布时间】:2021-10-21 13:02:28
【问题描述】:

我对 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中

【问题讨论】:

    标签: python html django forms xlsxwriter


    【解决方案1】:

    对于您的 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>
        ...
    

    【讨论】:

    • 我在这行country = ChoiceField(label='name_sheet', default='5', choices=choices) 中收到了这个错误TypeError: __init__() got an unexpected keyword argument 'default'。为什么会有这个问题?
    • 我也遇到了年份的问题,应该将其创建为列表,我遇到了 year1 和 year2 的问题,因为它不是列表
    • 我的错,字段中的“默认”项目应该是“初始”。我已经更正了。
    • 至于 year1 和 year2 需要选择字段...您可以轻松地将它们更改为 ChoiceFields。我已经为此更新了代码。您需要更改范围以满足您的需要。
    • 我得到了一个错误的年份,choices = []; for year in range (2000, 2050):; choices.append( (year, year) )... 我试图改变这个顺序,并在choice.append 中放入 year1 和 year2。抱歉打扰你。还有一个问题,我是否将带有或不带有 def 函数的脚本代码放在这里 &lt;use form inputs as needed&gt;,我是否创建带有 def 函数的新类?
    猜你喜欢
    • 1970-01-01
    • 2023-01-04
    • 2011-05-31
    • 2022-01-19
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多