我试图通过在管理员内部调整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_to_import”字段中放入的文件。在Forms.py中获取AttributeError:’function’对象没有属性’FILES’。
经过长时间的搜索,我找到了答案:使用标准表单在管理员内部创建视图
形成:
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))