我有一个Django模型的宿舍,其中一个字段FileUpload从中我将采取一个CSV文件并填充数据库,我一直在尝试过去两天搜索如何这样做,但不能得到那个工作 这个how to import csv data into django models问题的作品,但只有当我有文件的路径,我尝试了很多方法,但没有成功。此外在那之后我试图寻找更难How do I get a files absolute path after being uploaded in Django?我看到这个但即使如此,因为它显示了一些错误将数据从一个CSV文件存储到数据库
我用这个URL映射 url(r'^test/$',views.FileUpload.as_view(),name="test")
我无法得到它的工作,但它显示了一些命名空间的错误。 请告诉我该怎么做,如果你对我有一些建议,我应该如何重新开始,我感觉真的迷失了方向。 我想从用户那里得到文件,然后填充数据库
可以这样(How do I transfer data in .csv file into my sqlite database in django?)做成那样,我们可以创建一个接受CSV,然后通过解析填充数据库的FileField的形式,问题在于:我们不能硬编码路径。那么我们应该怎么做。
EDIT views.py
from django.views import View
class FileUpload(View):
def post(self, request):
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
initial_obj = form.save(commit=False)
data=initial_obj['document']
with open((data),'rb') as csvfile:
spamreader = csv.reader(csvfile)
for row in spamreader:
_, created=Document.objects.get_or_create(
name=row[0],
description = row[1],
importance=row[2],
)
initial_obj.save()
form.save()
return redirect('/')
else:
return render(request,'file_upload_form.html',{'form':form})
def get(self, request):
return render(request, 'file_upload_form.html', {'form': form,})
forms.py
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = ('description', 'document',)
models.py
class Document(models.Model):
name=models.CharField(max_length=50,blank=True)
description=models.CharField(max_length=255, blank=True)
importance=models.CharField(max_length=10, default="High")
document = models.FileField(upload_to='documents/')
uploaded_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.description
我没有收到任何错误,但它并未从CSV文件中将数据保存到数据库中,并将我重定向到需要上传的同一页面,并在文档字段中显示错误“此字段是必需的”。
更新:我解决了这个问题的详细信息here
我是新手,精心制作怎么样。 – 4rshdeep
将此代码添加到您的'DocumentForm'中,然后迭代您的文件并将其保存到数据库中 –
@unpaired_electron在另一个[post](https://stackoverflow.com/a/44343404/1526703)上看到您的问题,然后返回检查你是否仍然需要帮助。在Moe Far的回复中,_file_是接受csv文件路径的字段的名称(因此您不必对其进行硬编码)。一旦你按照Moe的建议添加了上面的代码,用户可以简单地在前端输入路径,并且可以将csv提供给数据库(你如何从csv填充数据库,进入'做你想做的任何事情'部分在上面的代码中)。回复,如果你需要更多的澄清 – Anupam