Pandas датафрейм не работает должным образом после развертывания на heroku (проект Django) - PullRequest
0 голосов
/ 20 апреля 2020

Я создал программу, которая выполняет ввод данных и возвращает таблицу pandas (информация сохраняется в списке, называемом JOB_INFO, вверху файла views.py - я прикреплю это ниже) с некоторыми результатами. который можно скачать. У меня также есть рендеринг таблицы на странице html, которая имеет форму ввода данных - таблица отображается ниже формы и обновляется (добавляется) при каждом вводе пользователем (отправка формы). Это отлично работает в разработке на моей локальной машине, но когда она успешно развернута на heroku, она начинает действовать и ведет себя не так, как ожидалось.

Примеры включают: Не обновлять таблицу - кажется, что форма отправляется, но таблица не обновляется. Если я продолжу пытаться, это внезапно сработает. Но потом я попробую другой, и предыдущий исчезнет, ​​и в таблице появится только последний. Это кажется таким случайным. Не очищать список - у меня есть кнопка для очистки таблицы, но она тоже не работает. Если я нажму кнопку много раз, она может работать внезапно. Но затем случайно в таблице снова появится некоторая информация, которая, как я думал, была очищена! Информация в загруженном файле, когда я подумал, что очистил ее, - это само собой разумеется.

В двух словах, назвать его случайным - это, вероятно, лучший способ описать его. Он просто не делает то, что я хочу, и чего от него ожидают.

views.py

from django.shortcuts import render, redirect, get_object_or_404, reverse, HttpResponse
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from .models import Data
from .forms import DataForm, SearchAndUpdateForm
from io import BytesIO
import pandas as pd
import xlsxwriter


JOB_INFO = {
    "Plentific Job Number": [],
    "WorkOrder Number": [],
    "Invoice Number Found": [],
    "Payments": [],
    "Job Number Exists": [],
} 


def data_entry(request):
    """
    Creates new instance of data entry form and renders it on html page
    along with a report table, which updates with each data entry input
    """

    form = SearchAndUpdateForm()

    df = pd.DataFrame(JOB_INFO,
        columns=[
            "Plentific Job Number",
            "WorkOrder Number",
            "Invoice Number Found",
            "Payments",
            "Job Number Exists",
        ])

    if not df.empty:
        df_html = df.to_html(classes="table table-striped table-hover")
        return render(request, "data_entry.html", {
            "form": form, "df_html": df_html})
    else:
        return render(request, "data_entry.html", {
                "form": form})


def export_job_info_report(request):
    """
    Exports the job_info list as an Excel spreadsheet
    and saves it to user's local directory
    """

    df = pd.DataFrame(JOB_INFO)

    output = BytesIO()
    writer = pd.ExcelWriter(output, engine='xlsxwriter')
    df.to_excel(writer, sheet_name='report', index=False)
    writer.save()
    output.seek(0)
    response = HttpResponse(output,
        content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = 'attachment; filename=%s.xlsx' % 'Download'

    return response


def clear_report_info(request):
    """Empties the job_info dictionary"""

    JOB_INFO["Plentific Job Number"].clear()
    JOB_INFO["WorkOrder Number"].clear()
    JOB_INFO["Invoice Number Found"].clear()
    JOB_INFO["Payments"].clear()
    JOB_INFO["Job Number Exists"].clear()

    return redirect(reverse(data_entry))

html page

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

{% load crispy_forms_tags %}

<div class="jumbotron">

    <h1>Data Entry Tool:</h1>

    <form action="{% url 'search_update_feedback' %}" method="GET">
        {{ form|crispy }}
        <button class="btn btn-success" type="submit" data-toggle="tooltip" data-placement="right" title="Updates the database with the info provided above">
            Update and Fetch Info
        </button>
    </form>

    <br>

    <form action="{% url 'export_job_info_report' %}" method="GET">
        <button class="btn btn-success" type="submit" data-toggle="tooltip" data-placement="right" title="Downloads the report below in .xlsx format">
            Download Report
        </button>
    </form>

    <br>

    <form action="{% url 'clear_report_info' %}" method="GET">
        <button class="btn btn-success" type="submit" data-toggle="tooltip" data-placement="right" title="Warning! You will lose all of the data below (does not affect database data)">
            Clear Report - hover over me!
        </button>
    </form>

</div>

<hr>

{{ df_html | safe }}

{% endblock %}

urls

urlpatterns = [
    path("", data_entry, name="data_entry"),
    path("export_job_info_report/", export_job_info_report, name="export_job_info_report"),
    path("clear_report_info/", clear_report_info, name="clear_report_info"),
]

Конечно, я упустил множество функций, чтобы сэкономить время на чтение, но, пожалуйста, дайте мне знать, если что-то еще можно / нужно добавить, чтобы помочь понять проблему. Любая помощь будет принята с благодарностью.

1 Ответ

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

Мне удалось решить эту проблему, заменив список JOB_INFO новой Django моделью с такими же именами полей, например:

from django.db import models

class JobInfoReport(models.Model):
"""The following are prefixed with 'r' to represent report"""

r_plentific_job_number = models.CharField(max_length=7)
r_wo_number = models.CharField(max_length=6)
r_invoice_number_found = models.CharField(max_length=5)
r_payments = models.CharField(max_length=100)
r_job_number_exists = models.CharField(max_length=50)

def __str__(self):
    return self.r_plentific_job_number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...