我正在尝试使用销售人员和客户之间的交易数据创建一个Django Web应用程序。数据源是一个.txt文件,我想知道是否存在一种更有效的方法来导入所有数据,而无需从管理页面手动添加它们。
我为允许文件上传的表单提供了一个html模板,但是我似乎无法通过request.file获取文件
CSV-Upload.html
{% load static %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="file">
<button type="submit">Upload</button>
</form>
{% endblock %}
views.py
@permission_required('admin.can_add_log_entry')
def data_upload(request):
template="CSV_upload.html"
if request.method == "GET":
return render(request, template)
txtfile = request.FILES['file']
stripped = (line.strip() for line in txtfile)
lines = (line.split(",") for line in stripped if line)
with open('log.csv', 'w') as out_file:
writer = csv.writer(out_file)
writer.writerows(lines)
for line in txtfile.readline():
row = line.split(',')
_, created = Transaction.objects.create(
TrxnNo=row[0],
DocRef=row[1],
AcCrIsMinus1=row[2],
CxNo=row[3],
AcCurWTaxAmt=row[8],
HomeWTaxAmt=row[9],
ProjNo=row[10],
LocNo=row[11],
SalesNo=row[12],
)
_, created = Document.objects.update_or_create(
DocRef=row[1],
DocDate=row[0],
)
_, created = Customer.objects.update_or_create(
CxNo=row[3],
CxName=row[4],
Postal=row[5],
CxContact=row[6],
AcCur=row[7]
)
_, created = Project.objects.update_or_create(
ProjNo=row[10],
)
_, created = Location.objects.update_or_create(
LocNo=row[11],
)
_, created = SalesPerson.objects.update_or_create(
SalesNo=row[12],
SalesName=row[13],
SalesContact=row[14]
)
context = {}
return render(request, template, context)
答案 0 :(得分:0)
我不是专家,但我认为您的结构很奇怪,您的观点应该是这样的。
def data_upload(request):
if request.method == 'POST':
from = Yourform(request.POST, request.FILES)
if form.is_valid():
your_file = request.FILES['file']
# do your things with the file
return HttpResponse("it worked")
else:
form = YourForm()
return render(request,'template.html', {'form': form})
文档(https://docs.djangoproject.com/en/2.1/topics/http/file-uploads/)也说
请注意,如果request方法,则request.FILES仅包含数据 是POST,发布请求的具有属性 enctype =“ multipart / form-data”。否则,request.FILES将为空。
答案 1 :(得分:0)
您的问题尚不清楚100%,但是您是否发现正在写log.csv
,但是没有创建交易,文档和客户?如果是这样,我认为是因为您要遍历txtfile
两次。
您在此处阅读了整个文件:
stripped = (line.strip() for line in txtfile)
txtfile
的内部位置是您在文件中所处的位置。遍历文件中的所有行之后,该位置位于文件的末尾。因此,当您尝试再次浏览文件时……
for line in txtfile.readline():
…您已经在文件末尾,因此readline
没有更多行可提供。
您可以使用txtile.seek(0)
将位置设置回文件的开头。
此文档记录在https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects
FWIW,您可能想看看Python's built-in CSV module,这可能会使您尝试执行的操作变得容易一些。