Django-Admin:集成自定义表单

Posted

技术标签:

【中文标题】Django-Admin:集成自定义表单【英文标题】:Django-Admin: integrating custom forms 【发布时间】:2011-12-14 21:43:37 【问题描述】:

我正在尝试将 CSV 文件的导入表单构建到给定模型的管理界面中。可以从模型的 change_list 访问视图,但会引发模板语法错误。

我做错了什么?我是否必须创建自己的模板,或者我可以以某种方式重新使用现有的 admin/change_form.html 而我就是不明白?

追溯

第 60 行被突出显示。

Template error:
In template site-packages\django\contrib\admin\templates\admin\change_form.html,
    error at line 60
Caught KeyError while rendering: 'opts'
50 : % endfor %
51 : 
52 : % block after_field_sets %% endblock %
53 : 
54 : % for inline_admin_formset in inline_admin_formsets %
55 :     % include inline_admin_formset.opts.template %
56 : % endfor %
57 : 
58 : % block after_related_objects %% endblock %
59 : 
60 :  % submit_row %
61 : 
62 : % if adminform and add %
63 :    <script type="text/javascript">document.getElementById(" adminform.first_field.id_for_label ").focus();</script>
64 : % endif %
65 : 
66 : # JavaScript for prepopulated fields #
67 : % prepopulated_fields_js %
68 : 
69 : </div>
70 : </form></div>

views.py

def import_tags(request):
    if request.method == "POST":
        form = RfidImport(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            success = True
            context = "form": form, "success": success
            return HttpResponseRedirect("../")
    else:
        form = RfidImport()
        context = "form": form
        return render_to_response("admin/change_form.html", context,
            RequestContext(request))

forms.py

class RfidImport(forms.ModelForm):
    file_to_import = forms.FileField()

    class Meta:
        model = RfidTag
        fields = ("file_to_import", )

    def save(self, commit=False, *args, **kwargs):
        form_input = RfidImport()
        file_csv = self.cleaned_data['file_to_import']
        csv.register_dialect('excel-new', delimiter=';', quoting=csv.QUOTE_NONE)
        records = csv.reader(file_csv, dialect='excel-new')
        for line in records:
            self.system = line[0]
            self.tagId = line[1]
            self.serial = line[2]
        form_input.save()
    datafile.close()

admin.py

class RfidTagAdmin(admin.ModelAdmin):
    list_display = ('tagId','serial', 'system', 'user')

    def get_urls(self):
        urls = super(RfidTagAdmin, self).get_urls()
        my_urls = patterns('',
            (r'^import/$', self.admin_site.admin_view(import_tags))
        )
        return my_urls + urls

    pass

admin.site.register(RfidTag, RfidTagAdmin)

【问题讨论】:

我也遇到了同样的问题,但没有出现表单。概述的方法似乎很完美,但 Django 1.4.3 的模板显示内容block content,而不是form。因此,view.py's else 块中的第二行必须是:context = 'content': form 【参考方案1】:

您肯定需要使用自己的模板,或者修改更改表单同时修改更改视图。例如,将此导入添加到更改表单本身应该很简单。

Django 的管理员为它的管理员使用了很多神奇的东西,并且这些模板有许多标签,这些标签特定于通过其更改/更改列表视图传入的对象。

改为扩展admin/base_site.html,您就可以开始了。

【讨论】:

谢谢,管理员在内部确实使用了很多我没有提供的魔法。【参考方案2】:

您需要向视图的上下文传递另外两个变量:

context['opts'] = RfigTag._meta
context['app_label'] = RfigTag._meta.app_label

【讨论】:

【参考方案3】:

也许你只需要这样做:

class RfidTagAdmin(admin.ModelAdmin):
      form = RfidImport
      ...

参考:https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

【讨论】:

以上是关于Django-Admin:集成自定义表单的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 中将条带支付与自定义表单集成? [关闭]

php 将自定义字段添加到Popup Maker MailChimp集成表单。

使用过滤器将表单提交给 django-admin 模型

将 paypal 按钮与自定义表单集成,并在单击该按钮时将客户信息保存到数据库中

如何创建自定义响应式表单元素?

Django-Admin 和 Django-Summernote 在我的表单中创建一个文件字段