Загрузка данных через лист Excel с использованием django-excel
Я создаю веб-сайт с использованием Django, и я хотел бы создать функциональность, с помощью которой пользователь с помощью таблицы Excel может загружать информацию и заполнять базу данных. Поэтому я устанавливаю пакет django-excel и следую примеру:
settings.py:
FILE_UPLOAD_HANDLERS = ("django_excel.ExcelMemoryFileUploadHandler",
"django_excel.TemporaryExcelFileUploadHandler")
urls.py:
url(r'^import_sheet/', views.import_sheet, name="import_sheet"),
views.py:
class UploadFileForm(forms.Form):
file = forms.FileField()
def upload(request):
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
filehandle = request.FILES['file']
return excel._make_response(filehandle.get_sheet(),"xslx",file_name="download")
else:
form = UploadFileForm()
return render(request,'upload_form.html',{
'form': form,
'title': 'Excel file upload',
'header': 'Please choose a valid excel file'
})
def import_sheet(request):
if request.method == "POST":
form = UploadFileForm(request.POST,
request.FILES)
if form.is_valid():
request.FILES['file'].save_to_database(
model= quote_input,
mapdict= ["value_date", "value", "type", 'name'])
return HttpResponse("OK")
else:
return HttpResponseBadRequest()
else:
form = UploadFileForm()
return render(
request,
'upload_form.html',
{'form': form})
models.py:
class quote_input(models.Model):
value_date = models.DateField()
value = models.FloatField()
type = models.TextField(max_length=254)
name = models.TextField(max_length=254)
# link
fund = models.ForeignKey(Fund)
benchmark = models.ForeignKey(Benchmark)
factor = models.ForeignKey(Factors)
stress_factor = models.ForeignKey(Stress_Factors)
Когда я пытаюсь этот код, загрузив базовый лист Excel:
Я получил ОК (HttpResponse), но когда я посмотрел на базу данных, я ничего не загрузил.
У кого-то есть такая же проблема? или можете привести другой пример, который я могу использовать? другая методология?
Другой вопрос: в документации django-excel есть ссылка на функцию "choice_func", которая определена как пользовательская функция форматирования. Кто-нибудь может предоставить больше информации об этой функции?
2 ответа
Вот версия моего кода, я использую библиотеку xlrd.
import re
import xlrd
from agencies.models import Invite
from extras.permissions import send_mail_wrapper
from sms.sms_api import send_sms
def handle_uploaded_file(request, f):
book = xlrd.open_workbook(file_contents=f.read())
for sheet in book.sheets():
number_of_rows = sheet.nrows
number_of_columns = sheet.ncols
for row in range(1, number_of_rows):
first_name = (sheet.cell(row, 0).value)
last_name = (sheet.cell(row, 1).value)
email = (sheet.cell(row, 2).value)
phone_cell = (sheet.cell(row, 3).value)
if phone_cell:
phone = re.sub("[^0-9]", "", str(phone_cell))
else:
phone = ""
gender = (sheet.cell(row, 4).value).upper()
if email != "":
invite, created = Invite.objects.get_or_create(agency=request.user.agency, email=email)
if email and created:
send_sms(phone)
send_mail_wrapper(
"You \'ve been invited", 'email/invite_email.html',
{}, [email], from_email='Casey <success@email.com>')
И мнение:
class StudentBulkAddView(ListView):
model = Student
template_name = 'student_add.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(DashboardStudentBulkAddView, self).dispatch(*args, **kwargs)
def post(self, request):
if self.request.user.is_authenticated:
try:
handle_uploaded_file(request, request.FILES['student_file'])
success = True
И шаблон:
<form action="{% url 'students:student_dashboard_bulk_invite' %}" method="POST"
enctype="multipart/form-data">
<div class="form-settings notes-form">
{% csrf_token %}
{{ upload_form }}
<button id="invite-tutor-btn" class="btn btn-primary margin-top"
data-loading-text="Loading..." type="submit">Save
</button>
</div>
</form>
Я думаю, все, что вам нужно сделать, это:
def upload(request):
form = None
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
filehandle = request.FILES['file']
# call import_sheet to import the sheet into your database
return import_sheet(request)
form = form or UploadFileForm()
return render(request,'upload_form.html',{
'form': form,
'title': 'Excel file upload',
'header': 'Please choose a valid excel file'
})