扩展django表单

san*_*lto 1 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
    )
Run Code Online (Sandbox Code Playgroud)

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

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

想法?

谢谢!!

Tho*_*zco 5

扩展ModelAdmin

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

在这里,你想要覆盖ModelAdminsave_form方法.
save_form发生在addtion 3个参数self:request, form, change.您将执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

通常,Django类有很多钩子,所以你可以在那里插入你的自定义逻辑.

你为什么要这样做?

在这里,您只是隐藏输入,但任何拥有不错浏览器的人都可以修改此值并Truepublished输入中发布.