将csv数据导入Django Admin中的数据库

将csv数据导入Django Admin中的数据库,django,django-models,csv,django-admin,Django,Django Models,Csv,Django Admin,我尝试通过在管理员中调整modelform将csv文件导入数据库,方法如下: models.py: class Data(models.Model): place = models.ForeignKey(Places) time = models.DateTimeField() data_1 = models.DecimalField(max_digits=3, decimal_places=1) data_2 = models.DecimalField(max_

我尝试通过在管理员中调整modelform将csv文件导入数据库,方法如下:

models.py:

class Data(models.Model):
    place = models.ForeignKey(Places)
    time = models.DateTimeField()
    data_1 = models.DecimalField(max_digits=3, decimal_places=1)
    data_2 = models.DecimalField(max_digits=3, decimal_places=1)
    data_3 = models.DecimalField(max_digits=4, decimal_places=1)
Forms.py:

import csv
class DataImport(ModelForm):
    file_to_import = forms.FileField()

    class Meta:
        model = Data
        fields = ("file_to_import", "place")

    def save(self, commit=False, *args, **kwargs):
        form_input = DataImport()
        self.place = self.cleaned_data['place']
        file_csv = request.FILES['file_to_import']
        datafile = open(file_csv, 'rb')
        records = csv.reader(datafile)
        for line in records:
            self.time = line[1]
            self.data_1 = line[2]
            self.data_2 = line[3]
            self.data_3 = line[4]
            form_input.save()
        datafile.close()
Admin.py:

class DataAdmin(admin.ModelAdmin):
    list_display = ("place", "time")
    form = DataImport

admin.site.register(Data, DataAdmin)
但我一直在尝试导入我放在“file\u to\u import”字段中的文件。正在forms.py中获取AttributeError:“函数”对象没有属性“文件”

我做错了什么?

save()
方法中,您没有任何对请求对象的访问权限-您可以看到它没有传入。通常情况下,您希望在那里有一个
namererror
,但我怀疑您在文件的其他地方有一个名为
request()
的函数

在保存时,所有相关数据都应该在
已清理的\u data
中:因此您应该能够

file_csv = self.cleaned_data['file_to_import']

此时,您将遇到另一个问题,即当您打开
时,您不能这样做,因为
文件\u to\u导入
不是服务器文件系统上的文件,而是从客户端流式传输的内存中文件。您应该能够将
文件\u csv
直接传递到
csv.reader

经过长时间的搜索,我找到了一个答案:使用标准表单在管理员内部创建一个视图

表格:

观点:

@staff_member_required
def import(request):
    if request.method == "POST":
        form = DataInput(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            success = True
            context = {"form": form, "success": success}
            return render_to_response("imported.html", context,
            context_instance=RequestContext(request))
    else:
        form = DataInput()        
        context = {"form": form}
        return render_to_response("imported.html", context,
        context_instance=RequestContext(request)) 
其余部分是本文的一部分:

看看django admin import
,它或多或少地实现了您想要的功能——您可以上传XLS(不是CSV,但这不重要),并允许您为模型字段分配列。还支持默认值


此外,它不排除手动修改单个记录的可能性,因为您不必替换管理中使用的默认模型表单。

您说得对。但现在我有了一个AttributeError:“DataImport”对象没有“cleaned_data”属性。另外,为了避免一些问题,我在所有模型的字段中添加了“blank=True”。谢谢你的建议!链接死了,但在archive.org上仍然存在:alternative Link Data()是某种特殊的django工具类还是您自己的数据模型?这是我自己的数据模型好吧,链接不可用:'(
@staff_member_required
def import(request):
    if request.method == "POST":
        form = DataInput(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            success = True
            context = {"form": form, "success": success}
            return render_to_response("imported.html", context,
            context_instance=RequestContext(request))
    else:
        form = DataInput()        
        context = {"form": form}
        return render_to_response("imported.html", context,
        context_instance=RequestContext(request))