Import csv data into database in Django Admin

后端 未结 3 1578
粉色の甜心
粉色の甜心 2020-12-04 08:51

I\'ve tried to import a csv file into a database by tweaking the modelform inside the admin doing this:

models.py:

class Data(models.Model):
    plac         


        
相关标签:
3条回答
  • 2020-12-04 09:08

    Take a look at django-admin-import, it does more or less exactly what you want -- you can upload a XLS (not a CSV, but that should not matter) and lets you assign columns to model fields. Default values are also supported.

    https://pypi.org/project/django-admin-import/

    Additionally, it does not take away the possibility to modify individual records by hand because you don't have to replace the default model form used in the administration.

    0 讨论(0)
  • 2020-12-04 09:14

    In the save() method, you don't have any access to the request object - you can see that it's not passed in. Normally you would expect to have a NameError there, but I suspect that you've got a function elsewhere in the file called request().

    At the point of saving, all the relevant data should be in cleaned_data: so you should be able to do

    file_csv = self.cleaned_data['file_to_import']
    

    At that point you'll have another problem, which is when you get to open - you can't do that, as file_to_import is not a file on the server filesystem, it's an in-memory file that has been streamed from the client. You should be able to pass file_csv directly to csv.reader.

    0 讨论(0)
  • 2020-12-04 09:25

    After a long search i found an answer: Create a view inside the admin using a standard form

    Form:

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

    The view:

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

    The rest is part of this post: http://web.archive.org/web/20100605043304/http://www.beardygeek.com/2010/03/adding-views-to-the-django-admin/

    0 讨论(0)
提交回复
热议问题