django-excel, pyexcel, save_to_database [объект-функция не имеет атрибута _meta] - PullRequest
0 голосов
/ 04 ноября 2018

Я хочу передать данные Excel в БД (БД postgres).

В качестве ориентира pyexcel я использую функцию save_to_database

но это не работает, я понятия не имею, где неправильно .. Пожалуйста, помогите мне

я получил эту ошибку: Внутренняя ошибка сервера: / weekly_upload Traceback (последний вызов был последним): ... AttributeError: у объекта 'function' нет атрибута '_meta' [04 / Nov / 2018 21:53:55] "POST / weekly_upload HTTP / 1.1" 500 138219

form.py

from django import forms
from .models import Documents, Weekly_upload
from .models import Project_code

class UploadFileForm(forms.Form):
file=forms.FileField()

view.py

from __future__ import unicode_literals
from .forms import UploadFileForm, DocumentForm
from django.shortcuts import render, get_object_or_404
import openpyxl, pyexcel

from django.core.files.storage import FileSystemStorage
from django.http import HttpResponse
from .models import Weekly_upload

def weekly_upload(request):
if request.method=='POST':
    #form=UploadFileForm(request.POST, request.FILES)
    form=UploadFileForm(request.POST, request.FILES)
    if form.is_valid():               
        print(form.is_valid())
        print("save to database...")
        request.FILES['file'].save_to_database(model=weekly_upload,
                                               initilaizers = None,
                                               mapdict={'project_id':'project_id',
                                                        'plan_indicator':'plan_indicator',
                                                        'region':'region',
                                                        'country':'country',
                                                        'priority':'priority',
                                                        'desc_kr':'desc_kr',
                                                        'desc_en':'desc_en',
                                                        'continuity':'continuity',
                                                        'business_period':'business_period',
                                                        'plan_pers_num':'plan_pers_num',
                                                        'noted_continue':'noted_continue',
                                                        'train_org':'train_org',
                                                        'invitation_local':'invitation_local',
                                                        'start_month':'start_month',
                                                        'start_time':'start_time',
                                                        'end_time':'end_time',
                                                        'train_period':'train_period',
                                                        'koica_resp':'koica_resp',
                                                        'association_resp':'association_resp',
                                                        'accounting_resp':'accounting_resp' }
                                                              )   
        return HttpResponse("OK")  
print("hello1")
return render(request, 'rndsettle/weekly_upload.html', {})

urls.py

from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^company_code', views.company_code, name='company_code'),
url(r'^department_code', views.department_code, name='department_code'),
url(r'^project_code', views.project_code, name='project_code'),
url(r'^account_code', views.account_code, name='account_code'), 
url(r'^common_code', views.common_code, name='common_code'),
url(r'^weekly_report', views.weekly_report, name='weekly_report'),
url(r'^weekly_upload', views.weekly_upload, name='weekly_upload'),

]

weekly.html

{% extends 'rndsettle/base.html' %}
{% load staticfiles%}
{% block content %}


<div class="col-sm-9">        
    <body style="margin-top: 30px; margin-left: 30px;">
        <!--<form action="{% url 'weekly_upload' %}" method="post" enctype="multipart/form-data">-->
        <form action="{% url 'weekly_upload' %}" method="post" enctype="multipart/form-data" >
            {%csrf_token%}
            <input multiple 
                   type="file"
                   name="file" 
                   style="border: 1px solid black; padding: 5px;"
                   required="required"/>
            <p>
            </p>
            <input type="submit"
                   style="border: 1px solid green; padding:5px; border-radius: 2px; cursor:pointer;"/>            
        </form>
        <p>
        </p>
        <hr>
        {% if uploaded_file_url %}
        <p>
            File uploaded at : <a href="{{uploaded_file_url}}">{{uploaded_file_url}}</a>
        </p>
        {%endif%}
        <p>
            <a href="{% url 'index' %}"> Return to Main Screen </a>
        </p>

    {% for row in excel_data %}
        {% for cell in row %}
            {{ cell }}&nbsp;&nbsp;
        {% endfor %}
        <br>
    {% endfor %}
        <br>           
    </body>
</div>

{% endblock%}

трассировка назад

Internal Server Error: /weekly_upload 
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/workspace/rnd/rndsettle/views.py", line 107, in weekly_upload
'accounting_resp':'accounting_resp' }
File "/usr/local/lib/python2.7/dist-packages/django_excel/__init__.py", line 49, in save_to_database
pe.save_as(**params)
File "/usr/local/lib/python2.7/dist-packages/pyexcel/core.py", line 83, in save_as
return sources.save_sheet(sheet, **dest_keywords)
File "/usr/local/lib/python2.7/dist-packages/pyexcel/internal/core.py", line 43, in save_sheet
return _save_any(a_source, sheet)
File "/usr/local/lib/python2.7/dist-packages/pyexcel/internal/core.py", line 55, in _save_any
a_source.write_data(instance)
File "/usr/local/lib/python2.7/dist-packages/pyexcel/plugins/sources/db_sources.py", line 64, in write_data
**self._keywords
File "/usr/local/lib/python2.7/dist-packages/pyexcel/plugins/renderers/django.py", line 33, in render_sheet_to_stream
importer.append(adapter)
File "/usr/local/lib/python2.7/dist-packages/pyexcel_io/database/common.py", line 135, in append
self.__adapters[import_adapter.get_name()] = import_adapter
File "/usr/local/lib/python2.7/dist-packages/pyexcel_io/database/common.py", line 44, in get_name
return self.model._meta.model_name
AttributeError: 'function' object has no attribute '_meta'
[04/Nov/2018 21:53:55] "POST /weekly_upload HTTP/1.1" 500 138219

1 Ответ

0 голосов
/ 04 ноября 2018

Я не знаю django-excel или save_to_database, но ясно, что model=weekly_upload здесь неверно. weekly_upload - это ваша функция просмотра, но вы, вероятно, хотели использовать это класс модели, называемый Weekly_upload (с большой буквы W).

Попробуйте изменить эту последнюю строку здесь:

from .models import Weekly_upload
...
def weekly_upload(request):
    ...
    request.FILES['file'].save_to_database(model=weekly_upload, ...)

до:

    request.FILES['file'].save_to_database(model=Weekly_upload, ...)

Кроме того, я рекомендую принять соглашение об именах для Python pep8 для классов: WeeklyUpload.

Это поможет избежать такой ошибки. И, возможно, попытайтесь найти другое и более описательное имя для модели или функции представления, чтобы не путать их друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...