代码之家  ›  专栏  ›  技术社区  ›  aldeano

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

  •  23
  • aldeano  · 技术社区  · 14 年前

    型号.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()
    

    管理.py:

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

    我做错什么了?

    3 回复  |  直到 14 年前
        1
  •  18
  •   Suyash Garg aldeano    7 年前

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

    形式:

    class DataInput(forms.Form):
        file = forms.FileField()
        place = forms.ModelChoiceField(queryset=Place.objects.all())
    
        def save(self):
            records = csv.reader(self.cleaned_data["file"])
            for line in records:
                input_data = Data()
                input_data.place = self.cleaned_data["place"]
                input_data.time = datetime.strptime(line[1], "%m/%d/%y %H:%M:%S")
                input_data.data_1 = line[2]
                input_data.data_2 = line[3]
                input_data.data_3 = line[4]
                input_data.save()
    

    @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)) 
    

    其余部分是本文的一部分: http://web.archive.org/web/20100605043304/http://www.beardygeek.com/2010/03/adding-views-to-the-django-admin/

        2
  •  3
  •   Matthias Kestenholz    12 年前

    看一看 django-admin-import ,它或多或少地满足了您的要求--您可以上传一个XLS(不是CSV,但这不重要),并允许您将列分配给模型字段。也支持默认值。

    http://pypi.python.org/pypi/django-admin-import/0.2.1

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

        3
  •  1
  •   Daniel Roseman    14 年前

    save() 方法,您没有对请求对象的任何访问权限-您可以看到它没有传入。通常你会希望 NameError 但是我怀疑你在文件的其他地方有一个函数 request() .

    cleaned_data :所以你应该能够

    file_csv = self.cleaned_data['file_to_import']
    

    在那一点上你会有另一个问题,那就是当你到达 open -你不能那样做,因为 file_to_import file_csv 直接到 csv.reader .