在 django 管理列表视图中上传 CSV 文件,替换添加对象按钮
Upload CSV file in django admin list view, replacing add object button
我想替换管理页面列表视图中的添加对象按钮。基本思想是管理员可以下载数据库中所有模型的数据,使用工具编辑数据,然后重新上传为 CSV 文件。
在列表视图中,我正在努力覆盖表单,因为设置
class SomeModelForm(forms.Form):
csv_file = forms.FileField(required=False, label="please select a file")
class Meta:
model = MyModel
fields = '__all__'
class SomeModel(admin.ModelAdmin):
change_list_template = 'admin/my_app/somemodel/change_list.html'
form = SomeModelForm
other stuff
管理员 change_list.html 被覆盖如下:
{% extends "admin/change_list.html" %}
{% load i18n admin_urls admin_static admin_list %}
{% block object-tools-items %}
<form action="{% url 'admin:custom_submit_row' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>
{{ form.as_p }}
</p>
<p><input type="submit" value="Upload" /><input type="reset" value="Reset"></p>
</form>
{% endblock %}
之前 SomeModel 缺少 class Meta,根据 sebbs 的回复,这已经更新。原来的错误已经解决,但现在管理页面显示上传和重置按钮,但没有文件上传字段。
干杯
根据以下 sebb 的输入进行编辑。谢谢塞布。
修复的错误是
< class ‘my_model.admin.SomeModelAdmin'>: (admin.E016) The value of 'form' must inherit from 'BaseModelForm'
向您的 class SomeModelForm 添加如下内容:
class Meta:
model = YourModel
fields = '__all__'
并从 forms.Form 更改为 forms.ModelForm
OP这里,解决方法如下:
class SomeModelForm(forms.Form):
csv_file = forms.FileField(required=False, label="please select a file")
class SomeModel(admin.ModelAdmin):
change_list_template = 'admin/my_app/somemodel/change_list.html'
def get_urls(self):
urls = super().get_urls()
my_urls = patterns("",
url(r"^upload_csv/$", self.upload_csv, name='upload_csv')
)
return my_urls + urls
urls = property(get_urls)
def changelist_view(self, *args, **kwargs):
view = super().changelist_view(*args, **kwargs)
view.context_data['submit_csv_form'] = SomeModelForm
return view
def upload_csv(self, request):
if request.method == 'POST':
form = MineDifficultyResourceForm(request.POST, request.FILES)
if form.is_valid():
# process form
模板被覆盖为:
{% extends "admin/change_list.html" %}
{% load i18n admin_urls admin_static admin_list %}
{% block object-tools %}
{% if has_add_permission %}
<div>
<ul class="object-tools">
{% block object-tools-items %}
<form id="upload-csv-form" action="{% url 'admin:upload_csv' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>{{ form.non_field_errors }}</p>
<p>{{ submit_csv_form.as_p }}</p>
<p>{{ submit_csv_form.csv_file.errors }}</p>
<p><input type="submit" value="Upload" />
<input type="reset" value="Reset"></p>
</form>
{% endblock %}
</ul>
</div>
{% endif %}
{% endblock %}
表单需要一些自定义验证,否则这解决了自定义管理页面的困难部分。
详细说明这里发生了什么:
get_urls 被覆盖,以便可以将附加端点添加到管理页面,这可以指向任何视图,在本例中它指向 upload_csv
changelist_view 被覆盖以将表单信息附加到视图
change_list.html 模板块 "object-tools" 被表单字段覆盖
希望其他人也觉得这有帮助。
我想替换管理页面列表视图中的添加对象按钮。基本思想是管理员可以下载数据库中所有模型的数据,使用工具编辑数据,然后重新上传为 CSV 文件。
在列表视图中,我正在努力覆盖表单,因为设置
class SomeModelForm(forms.Form):
csv_file = forms.FileField(required=False, label="please select a file")
class Meta:
model = MyModel
fields = '__all__'
class SomeModel(admin.ModelAdmin):
change_list_template = 'admin/my_app/somemodel/change_list.html'
form = SomeModelForm
other stuff
管理员 change_list.html 被覆盖如下:
{% extends "admin/change_list.html" %}
{% load i18n admin_urls admin_static admin_list %}
{% block object-tools-items %}
<form action="{% url 'admin:custom_submit_row' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>
{{ form.as_p }}
</p>
<p><input type="submit" value="Upload" /><input type="reset" value="Reset"></p>
</form>
{% endblock %}
之前 SomeModel 缺少 class Meta,根据 sebbs 的回复,这已经更新。原来的错误已经解决,但现在管理页面显示上传和重置按钮,但没有文件上传字段。
干杯
根据以下 sebb 的输入进行编辑。谢谢塞布。 修复的错误是
< class ‘my_model.admin.SomeModelAdmin'>: (admin.E016) The value of 'form' must inherit from 'BaseModelForm'
向您的 class SomeModelForm 添加如下内容:
class Meta:
model = YourModel
fields = '__all__'
并从 forms.Form 更改为 forms.ModelForm
OP这里,解决方法如下:
class SomeModelForm(forms.Form):
csv_file = forms.FileField(required=False, label="please select a file")
class SomeModel(admin.ModelAdmin):
change_list_template = 'admin/my_app/somemodel/change_list.html'
def get_urls(self):
urls = super().get_urls()
my_urls = patterns("",
url(r"^upload_csv/$", self.upload_csv, name='upload_csv')
)
return my_urls + urls
urls = property(get_urls)
def changelist_view(self, *args, **kwargs):
view = super().changelist_view(*args, **kwargs)
view.context_data['submit_csv_form'] = SomeModelForm
return view
def upload_csv(self, request):
if request.method == 'POST':
form = MineDifficultyResourceForm(request.POST, request.FILES)
if form.is_valid():
# process form
模板被覆盖为:
{% extends "admin/change_list.html" %}
{% load i18n admin_urls admin_static admin_list %}
{% block object-tools %}
{% if has_add_permission %}
<div>
<ul class="object-tools">
{% block object-tools-items %}
<form id="upload-csv-form" action="{% url 'admin:upload_csv' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>{{ form.non_field_errors }}</p>
<p>{{ submit_csv_form.as_p }}</p>
<p>{{ submit_csv_form.csv_file.errors }}</p>
<p><input type="submit" value="Upload" />
<input type="reset" value="Reset"></p>
</form>
{% endblock %}
</ul>
</div>
{% endif %}
{% endblock %}
表单需要一些自定义验证,否则这解决了自定义管理页面的困难部分。
详细说明这里发生了什么:
get_urls 被覆盖,以便可以将附加端点添加到管理页面,这可以指向任何视图,在本例中它指向 upload_csv
changelist_view 被覆盖以将表单信息附加到视图
change_list.html 模板块 "object-tools" 被表单字段覆盖
希望其他人也觉得这有帮助。