5. 如何使用Django admin 上传CSV

你被要求在Hero admin页面可以上传csv,你需要添加一个链接到Hero更改列表页面,该页面将转到带有上传表单的页面。 你将为POST操作编写一个处理程序,以从创建csv对象:

  1. class CsvImportForm(forms.Form):
  2. csv_file = forms.FileField()
  3. @admin.register(Hero)
  4. class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
  5. ...
  6. change_list_template = "entities/heroes_changelist.html"
  7. def get_urls(self):
  8. urls = super().get_urls()
  9. my_urls = [
  10. ...
  11. path('import-csv/', self.import_csv),
  12. ]
  13. return my_urls + urls
  14. def import_csv(self, request):
  15. if request.method == "POST":
  16. csv_file = request.FILES["csv_file"]
  17. reader = csv.reader(csv_file)
  18. # Create Hero objects from passed in data
  19. # ...
  20. self.message_user(request, "Your csv file has been imported")
  21. return redirect("..")
  22. form = CsvImportForm()
  23. payload = {"form": form}
  24. return render(
  25. request, "admin/csv_form.html", payload
  26. )

然后通过重写admin/change_list.html模板创建entites/heroes_changelist.html模块:

  1. {% extends 'admin/change_list.html' %}
  2. {% block object-tools %}
  3. <a href="import-csv/">Import CSV</a>
  4. <br />
  5. {{ block.super }}
  6. {% endblock %}

最后创建csv_form.html,像这样:

  1. {% extends 'admin/base.html' %}
  2. {% block content %}
  3. <div>
  4. <form action="." method="POST" enctype="multipart/form-data">
  5. {{ form.as_p }}
  6. {% csrf_token %}
  7. <button type="submit">Upload CSV</button>
  8. </form>
  9. </div>
  10. <br />
  11. {% endblock %}

通过这些更改之后,你会在Hero修改列表页获得一个链接 5. 如何使用Django admin 上传CSV - 图1 这个是上传csv页面像这样: 5. 如何使用Django admin 上传CSV - 图2