Django:上传文件并阅读其内容以填充模型?

Tho*_*mas 9 django file-upload django-admin

我是Django的新手,想知道什么是Django方式在数据库中添加元素而不是从html表单中输入每个字段(就像默认情况下那样)但是上传单个文件(例如json文件) )将用于填充数据库?

所以说模型只有三个字段:标题,描述,数量.我有一个文本文件(myFile.txt),其中写有"myTitle:myDesc".

我想要的只是一个接受文本文件的FileField,所以我可以上传myFile.txt,标题和描述将从这个文件中读取.同时,数量将在文本输入中"正常"询问,因为默认情况下(仅从文件中读取标题和描述).

当然,将对文件进行验证以接受/拒绝上传的文件.我面临的问题是,如果我将FileField添加到模型中,该文件将存储在本地存储中.我希望读取上载文件的内容,用于在模型中创建条目,然后删除.

甚至管理员也不能手动添加在HTML表单中输入标题和描述的元素,而只能通过上传文件.有人可以用Django方式帮助我吗?

And*_*eev 8

您可以创建两种形式:

  1. 基于django.forms.Form该表单的表单用于从请求中获取文件
  2. 一种模型表单,用于验证模型字段并创建模型对象

然后你可以从第一个表单调用第二个表单,如下所示:

class MyModelForm(ModelForm):

    class Meta:
        model = MyModel


class FileUploadForm(forms.Form):

    file = forms.FileField()

    def clean_file(self):
        data = self.cleaned_data["file"]
        # read and parse the file, create a Python dictionary `data_dict` from it
        form = MyModelForm(data_dict)
        if form.is_valid():
            # we don't want to put the object to the database on this step
            self.instance = form.save(commit=False) 
        else:
            # You can use more specific error message here
            raise forms.ValidationError(u"The file contains invalid data.")
        return data

    def save(self):
        # We are not overriding the `save` method here because `form.Form` does not have it. 
        # We just add it for convenience.
        instance = getattr(self, "instance", None)
        if instance:
            instance.save()
        return instance

def my_view(request):
    form = FileUploadForm(request.POST, request.FILES)
    if form.is_valid():
        form.save()
    else:
        # display errors
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 1

我找到了另一种在保存模型之前填充模型的方法。

如果我们使用 admin.ModelAdmin,我们可以简单地重新定义 save_model() 方法,而不是使用 pre_save 或使用两种不同的形式:

def save_model(self, request, obj, form, change):
  obj.user = request.user
  # populate the model
  obj.save()
  # post actions if needed
Run Code Online (Sandbox Code Playgroud)