Python django1.8-上传Excel并插入数据库时如何手动追加信息
excel与左图类似,有3列 当插入数据库时,我需要手动添加2列,如右图所示,最后在数据库中总共插入5列。这两个附加列的信息是从其他数据库获取的 另一个功能是,如果已有文件,则新上载的文件将覆盖现有文件。[下面的views.py中的片段] 我已经试过两个三方工具,但都不管用,所以也许只使用django中嵌入的一个更好 版本:Python2.7。Excel 2013。Django1.8 非常感谢您的帮助。Hope可以提供有关如何附加这两列的详细信息片段:Python django1.8-上传Excel并插入数据库时如何手动追加信息,python,django,Python,Django,excel与左图类似,有3列 当插入数据库时,我需要手动添加2列,如右图所示,最后在数据库中总共插入5列。这两个附加列的信息是从其他数据库获取的 另一个功能是,如果已有文件,则新上载的文件将覆盖现有文件。[下面的views.py中的片段] 我已经试过两个三方工具,但都不管用,所以也许只使用django中嵌入的一个更好 版本:Python2.7。Excel 2013。Django1.8 非常感谢您的帮助。Hope可以提供有关如何附加这两列的详细信息片段: uploader = request.se
uploader = request.session['uploader']
Date=request.session['date']
forms.py
from django.core.files.storage import FileSystemStorage
from financialdata.storage import OverwriteStorage
class XXXXDataForm(forms.Form):
XXXXfile=forms.FileField(label='Select a file')
from django.core.files.storage import FileSystemStorage
def import_data(request):
if request.method == "POST":
form = XXXXForm(request.POST,request.FILES)
if form.is_valid():
newdoc= XXXX(docfile=request.FILES['docfile'])
newdoc.save()
return HttpResponseRedirect(reverse('homepage'))
else:
return HttpResponseBadRequest()
else:
form = XXXXForm()
return render_to_response(
'dataentry.html',
{
'form': form,
'title': 'Import excel data into database example',
'header': 'Please upload XXXX.xlsx:',
'message': 'File Saved!'
},
context_instance=RequestContext(request))
<!--How can I embed the following part to previous part?-->
class OverwriteStorage(FileSystemStorage):
def _save(self, name, content):
if self.exists(name):
self.delete(name)
return super(OverwriteStorage, self)._save(name, content)
def get_available_name(self, name):
return name
视图.py
from django.core.files.storage import FileSystemStorage
from financialdata.storage import OverwriteStorage
class XXXXDataForm(forms.Form):
XXXXfile=forms.FileField(label='Select a file')
from django.core.files.storage import FileSystemStorage
def import_data(request):
if request.method == "POST":
form = XXXXForm(request.POST,request.FILES)
if form.is_valid():
newdoc= XXXX(docfile=request.FILES['docfile'])
newdoc.save()
return HttpResponseRedirect(reverse('homepage'))
else:
return HttpResponseBadRequest()
else:
form = XXXXForm()
return render_to_response(
'dataentry.html',
{
'form': form,
'title': 'Import excel data into database example',
'header': 'Please upload XXXX.xlsx:',
'message': 'File Saved!'
},
context_instance=RequestContext(request))
<!--How can I embed the following part to previous part?-->
class OverwriteStorage(FileSystemStorage):
def _save(self, name, content):
if self.exists(name):
self.delete(name)
return super(OverwriteStorage, self)._save(name, content)
def get_available_name(self, name):
return name
从django.core.files.storage导入文件系统存储
def导入_数据(请求):
如果request.method==“POST”:
form=XXXXForm(request.POST、request.FILES)
如果form.is_有效():
newdoc=XXXX(docfile=request.FILES['docfile'])
newdoc.save()
返回HttpResponseRedirect(反向(“主页”))
其他:
返回HttpResponseBadRequest()
其他:
form=XXXXForm()
返回render\u to\u响应(
“dataentry.html”,
{
“形式”:形式,
'标题':'将excel数据导入数据库示例',
'标题':'请上传XXXX.xlsx:',
“消息”:“文件已保存!”
},
上下文\实例=请求上下文(请求))
类重写存储区(文件系统存储):
定义保存(自身、名称、内容):
如果self.exists(名称):
self.delete(名称)
返回超级(覆盖范围,自我)。\u保存(名称,内容)
def get_可用_名称(self,name):
返回名称
可能是这样的:
我不运行我的代码,这是一个示例
if request.method == "POST":
form = XXXXForm(request.POST,request.FILES)
if form.is_valid():
docfile=request.FILES['docfile']
if isinstance(docfile, (InMemoryUploadedFile, TemporaryUploadedFile)):
book = xlrd.open_workbook(file_contents=docfile.read(), formatting_info=True, on_demand=True)
else:
book = xlrd.open_workbook(filename=docfile, formatting_info=True, on_demand=True)
sheet = book.sheet_by_index(0)
new_csv_file = csv.writer(open('new_filename', 'w'))
# read file
for line in range(1, sheet.nrows):
new_row = [request.session.get('uploader'), request.session.get('date')]
new_row.extend(sheet.row_values(line))
new_csv_file.writerow(new_row)
if request.method==“POST”:
form=XXXXForm(request.POST、request.FILES)
如果form.is_有效():
docfile=request.FILES['docfile']
如果是Instance(docfile,(在memoryUploadedFile中,临时上载的文件)):
book=xlrd.open\u工作簿(file\u contents=docfile.read(),formatting\u info=True,on\u demand=True)
其他:
book=xlrd.打开工作簿(文件名=docfile,格式设置=True,按需设置=True)
工作表=书本。工作表按索引(0)
new_csv_file=csv.writer(打开('new_filename','w'))
#读取文件
对于范围内的行(1,第N页):
new_row=[request.session.get('uploader'),request.session.get('date')]
新行扩展(图纸行值(行))
新建csv文件.writerow(新建行)
...
您不需要调用您的deletefunction@maazza,请将更正后的代码粘贴到下面好吗?谢谢。正如@maazza所说的,你创建了你的函数,但你没有调用它。在代码中的某个地方,您应该调用它,使其运行..@qasimalbaqali,谢谢,我刚刚上传了url。你的意思是在url中调用它吗?不是。我的意思是你创建了
delete
函数,这很好,但是现在你需要在创建函数后简单地调用它,就像在delete()
中调用一样,这样当表单有效时,函数就会被创建,然后正确执行?还记得如何执行函数吗?您只需编写函数和两个括号来调用它。您好@mrvol,实际上最后我使用了另一种使用SQL原始查询的方法,这只是一种破解,但至少可以解决问题。@Héléna如果您想插入数据库数据,这是最简单的。首先,您需要为这些数据创建模型。这与字段上传者、日期、问题、选择、投票类似。在表单清理之后,像下面的例子一样迭代文件,并创建带有值的列表。然后像这样将列表保存到DB