扩展Django表单

2024-10-01 07:34:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在医生那里读过这方面的资料,但是什么也没找到。在

你建议用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复制/粘贴代码,但是,似乎也不是一个好的选择。但是如果没有简单的方法来定制几个案例的表单,我就这么做。在

有什么想法?在

谢谢!!在


Tags: djangohttpsgithubcom应用程序表单站点forms
2条回答

扩展ModelAdmin

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

在这里,您需要重写ModelAdminsave_form方法。
save_formself:request, form, change中加入3个参数。您将执行以下操作:

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

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

你为什么要这么做?在

在这里,您只是隐藏了输入,但是任何有一个像样的浏览器的人都可以修改这个值并在您的published输入中发布True。在

I'd love to extend this form for some custom actions

停在那里。在

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

如果你想要“操作”,你应该写视图函数。在

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

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

  1. 使用模型窗体。https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/

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

相关问题 更多 >