Python 扩展django表单
我在文档中读到了这方面的内容,但什么也找不到 您是否建议在Django中扩展自定义表单 这是我的问题。我正在用Biblion写一个博客应用程序。问题是我不想使用默认行为(从管理站点创建博客帖子)。有这样一个表单:它有自定义逻辑来保存帖子(并进行一些解析) 我想将此表单扩展为一些自定义操作。例如,我想让一些用户创建博客帖子,但不允许他们发布。相反,我应该检查并调节它们。因此,出于这个原因,我正在尝试以下方法:Python 扩展django表单,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我在文档中读到了这方面的内容,但什么也找不到 您是否建议在Django中扩展自定义表单 这是我的问题。我正在用Biblion写一个博客应用程序。问题是我不想使用默认行为(从管理站点创建博客帖子)。有这样一个表单:它有自定义逻辑来保存帖子(并进行一些解析) 我想将此表单扩展为一些自定义操作。例如,我想让一些用户创建博客帖子,但不允许他们发布。相反,我应该检查并调节它们。因此,出于这个原因,我正在尝试以下方法: class PostForm(AdminPostForm): publish =
class PostForm(AdminPostForm):
publish = forms.BooleanField(
required = False,
widget = forms.HiddenInput # don't show it
)
它现在可以工作了,但我想问你们是否还有其他选择(我可以阻止它显示在我的模板中,迭代表单文件,但不太喜欢这个选项)
另一种选择是从AdminPostForm
复制/粘贴代码,但是,这似乎也不是一个好的选择。但是,如果没有简单的方法来定制几个案例的表单,我就这么做
想法
谢谢 扩展模型管理员
如果要在表单中实现每个用户的逻辑,您可能需要扩展ModelAdmin
,而不是表单
在这里,您希望覆盖ModelAdmin
的save\u form
方法。save_form
将3个参数添加到self
:请求、表单、更改
。您将执行以下操作:
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类有很多钩子,因此您可以在那里插入自定义逻辑
你为什么要这么做?
在这里,您只是隐藏了输入,但是任何一个拥有良好浏览器的人都可以修改此值,并在您发布的输入中发布True
。extensing ModelAdmin
如果要在表单中实现每个用户的逻辑,您可能需要扩展ModelAdmin
,而不是表单
在这里,您希望覆盖ModelAdmin
的save\u form
方法。save_form
将3个参数添加到self
:请求、表单、更改
。您将执行以下操作:
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类有很多钩子,因此您可以在那里插入自定义逻辑
你为什么要这么做?
在这里,您只是隐藏了输入,但是任何一个拥有良好浏览器的人都可以修改此值,并在您发布的输入中发布True
我想将此表单扩展为一些自定义操作
停在那里
表单没有“动作”。表单仅用于验证输入。ModelForms包含一个用于保存有效输入的扩展。重点是验证输入
如果您想要“操作”,您应该编写视图函数
您可能还需要创建自定义管理操作(而不是表单)
如果要从中删除项目,请执行此操作
“只不过是验证输入而已。”事实并非如此——例如,ModelForms用于模型检索和更新。@Marcin:While true;令人困惑的原因是试图让表单做得太多。“只做验证输入而已。”事实并非如此——例如,模型表单用于模型检索和更新。@Marcin:While-true;混淆的根源是试图让表单做得太多。+1隐藏字段与阻止它被更改是不同的。我知道这是不同的。但我会改变我的看法。不管怎样,谢谢。+1隐藏字段和阻止它被更改是不一样的。我知道这是不一样的。但我会改变我的看法。无论如何,谢谢你。