从Django中的文本字段填充管理表单

时间:2013-06-25 20:32:41

标签: django model admin

我正在尝试为表示学术论文的模型自定义Django管理编辑页面,以便有一个文本框可以作为模型中实际信息的“快捷方式”填写(基于BibTeX参考书目)它)。也就是说,用户可以简单地复制/粘贴BibTeX条目,单击按钮,并自动填写相关字段,而不是繁琐地填写“Publication”模型中的每个字段。

我设法通过编辑模板创建了一个不代表模型一部分的文本框和按钮,但是我无法弄清楚如何在不离开页面的情况下使按钮做任何事情,因为我可以不要覆盖视图。我希望它填充表单的字段,但保持在同一页面上,以便用户可以查看并编辑已解析的内容。

我如何制作一个动态填充Django管理员表单的按钮?

很抱歉,如果有一个非常简单的解决方案 - 我的团队和我是Django的新手!

1 个答案:

答案 0 :(得分:1)

你不能在不离开页面的情况下直接在Django中完成,或者至少提交和重新显示它。如果您严格不提交表单,可以使用Javascript来解析文本框的上下文并将它们分配给您的管理输入字段。

那就是说,我会通过为我的管理类定义表单,然后专门化save_model方法来实现。像这样:

class PublicationAdminForm(forms.ModelForm):
    class Meta:
        model = Publication
    bibtex_entry = forms.CharField(widget=forms.Textarea)

class PublicationAdmin(admin.ModelAdmin):
     form = PublicationAdminForm

     def save_model(self, request, obj, form, change):
         bibtex = form.cleaned_data['bibtex_entry']
         values = parse_bibtex(bibtex)
         obj.author = values['author']
         # etc etc, or whatever format you want to use to represent the values you're pulling from the BibTeX entry
         super(PublicationAdmin, self).save_model(request, obj, form, change)

显然,save_model中的确切代码将取决于你如何从BibTeX条目中提取信息 - 我想在保存之前根据表单内容演示在对象上分配属性值。

如果需要从BibTeX派生的字段,则会变得更难 - 您必须在表单上指定一个clean方法,该方法可以判断是否所有值都是BibTeX所需的内容可以从提交的内容中获得。无论如何,这可能是一个好主意,但如果不需要这些字段,您可能希望将该解析限制为表单的clean_bibtex方法。或者创建一个自定义字段类型,知道如何在其to_python方法中将BibTeX解析为类似字典,但这有点高级。

当然,管理员可能还需要其他设置。