扩展django表单

时间:2012-02-24 13:54:15

标签: python django django-models django-forms

我在文档中一直在阅读这篇文章但却找不到任何内容。

您是否建议在Django中扩展自定义表单?

这是我的问题。我正在使用Biblion编写博客应用程序。问题是我不想使用默认行为(从管理站点创建博客帖子)。有这样的形式:https://github.com/eldarion/biblion/blob/master/biblion/forms.py#L13具有自定义逻辑来保存Post(并进行一些解析)。

我希望扩展此表单以进行一些自定义操作。例如,我想让一些用户创建博客帖子,但不允许他们发布。相反,我应该检查并调节它们。因此,为此我尝试使用类似的东西:

class PostForm(AdminPostForm):
    publish = forms.BooleanField(
        required = False,
        widget = forms.HiddenInput # don't show it
    )

它现在正在运行,但我想问你们是否有其他选项(我可以阻止它显示在我的模板中,迭代表单文件,但不要非常喜欢这个选项)。

其他选项是从AdminPostForm复制/粘贴代码,但似乎也不是一个好的选择。但是,如果没有简单的方法来为几种情况定制表单,我就会这样做。

想法?

谢谢!

2 个答案:

答案 0 :(得分:5)

扩展ModelAdmin

如果您想在表单中实现每用户逻辑,可能需要扩展ModelAdmin而不是表单。

在这里,您要覆盖ModelAdmin的{​​{1}}方法 save_formsave_form self中添加了3个参数。您将执行以下操作:

request, form, change

通常,Django类具有很多的钩子,因此您可以在那里插入自定义逻辑。

你为什么要这样做?

在这里,您只是隐藏输入,但任何拥有不错浏览器的人都可以修改此值并在def save_form(self, request, form, change): instance = super(MyModelAdmin, self).save_form(request, form, change) if instance.published and not user.has_perm('mark_published'): instance.published = False #You could be displaying a message here. return instance 输入中发布True

答案 1 :(得分:-4)

  

我希望扩展此表单以进行一些自定义操作

停在那儿。

表单没有“动作”。表单仅用于验证输入。 ModelForms包含一个用于保存有效输入的扩展。重点是验证输入。

如果你想要“动作”,你应该写视图功能。

您可能还需要创建自定义管理操作https://docs.djangoproject.com/en/1.3/ref/contrib/admin/actions/(不是表单)

如果要从中删除项目,请执行此操作。

  1. 使用ModelForm。 https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/

  2. 列出“exclude”值中的字段。 https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/#using-a-subset-of-fields-on-the-form