在 django 管理列表视图中上传 CSV 文件,替换添加对象按钮

2024-01-27

我想替换管理页面列表视图中的添加对象按钮。其基本思想是,管理员可以下载数据库中所有模型的数据,使用工具编辑数据,然后作为 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 缺少 Meta 类,根据 sebbs 响应,此更新已更新。原始错误已解决,但现在管理页面显示上传和重置按钮,但没有文件上传字段。

cheers

使用下面 sebb 的输入进行编辑。谢谢塞布。 修复的错误是

: (admin.E016) 'form' 的值必须继承自 'BaseModelForm'


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 %}

该表单需要一些自定义验证,但否则这解决了自定义管理页面的困难部分。

详细说明这里发生了什么:

  1. get_urls 被重写,以便可以将附加端点添加到管理页面,这可以指向任何视图,在本例中它指向 upload_csv

  2. 重写changelist_view以将表单信息附加到视图

  3. change_list.html 模板块“object-tools”被表单字段覆盖

希望其他人也发现这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 django 管理列表视图中上传 CSV 文件,替换添加对象按钮 的相关文章

随机推荐