【问题标题】:Generating custom forms from DB schema从 DB 模式生成自定义表单
【发布时间】:2010-08-08 12:17:16
【问题描述】:

我是当前的 web2py 用户,但发现我仍然偶尔会回到 Django(我开始的地方)。特别是在处理我想使用 web2py 中尚不存在的一些特定 django 应用程序/插件/扩展的项目时。

在 web2py 中我不能没有的一件事,我正在 Django 中寻找解决方案,是从 db 表创建 html 表单并能够在视图中自定义它们的外观和布局的方法, 没有 javascript。

我正在寻找的主要内容:

  1. 从 db 表生成 html 表单
  2. 为生成的 html 表单中的每个字段分配自定义 css 类/ID(禁用 js)
  3. 通过视图中的方法调用将每个表单字段/元素放置在预制的 html 视图中

我有一张桌子 A。在 web2py 中我可以(在控制器中):

def display_form():
   form = SQLFORM(db.table_A)
   #Can I do the following in Django? Assign custom CSS to each form field?
   form.element(_name='email')['_class'] = = "custom_css_classes, list"

   if form.accepts(request.vars, session):
       response.flash = 'form accepted'
   elif form.errors:
       response.flash = 'form has errors'
   else:
       response.flash = 'please fill out the form'
   return dict(form=form)

那么,在视图中我可以做到:

form.custom.start
form.custom.widget.name
form.custom.widget.email
form.custom.widget.form_field_name
           ...
<div class="span-5 last"><input type="submit" class="register_btn" value="Sign Up"></input></div>
form.custom.end

上面获取一个 DB 表,创建一个 HTML 表单,然后让我将每个单独的表单字段粘贴到我想要的预制 HTML 中的任何位置(使用传递的“表单”上的那些“自定义”方法调用对象。包括我分配给生成的 html 表单的每个单独字段的自定义 css 类。

有关上述代码的详细信息,请参阅文档:

http://web2py.com/book/default/chapter/06?search=define_table

http://web2py.com/book/default/chapter/07?search=sqlform#SQLFORM

http://web2py.com/book/default/chapter/05?search=#Server-side-DOM-and-Parsing

http://web2py.com/book/default/chapter/07?search=form.custom

如何在 Django 中执行上述操作,而不会因布局黑客而弄脏我的 javascript。假设在我需要运行我的应用程序的浏览器中禁用了 javascript。此外,我很想使用 Django admin。也欢迎 Pylons 解决方案!

对此文章/教程/howtos 的链接将不胜感激。 另外,请使用您在回复中提到的方法对上述代码进行等效结果...

【问题讨论】:

    标签: python django django-forms pylons web2py


    【解决方案1】:

    使用ModelForm 并通过显式声明它们来覆盖您想要自定义的任何字段。

    如果你想设置像classid这样的字段属性,你需要做这样的事情:

    name = forms.CharField(
                    widget=forms.TextInput(attrs={'class':'special'}))
    

    如果您有兴趣,可以通过在 Meta 类中指定 fields 序列来更改字段的顺序:

    class Meta:
        model = YourModel
        fields = ('title', 'content')
    

    您可以在此处阅读完整的文档: http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.attrs

    【讨论】:

    • 您可以在一行中对 web2py 执行完全相同的操作:db.mytable.myfield.widget=lambda f,v:SQLFORM.widgets.string.widget(f,v,_class='special' )
    • 你没有注意到我把代码行分成两行只是为了便于阅读吗?
    【解决方案2】:

    如果您还没有,请查看 Django 的ModelForm。我假设您已将模型映射到相关表。 Vanilla ModelForm 实例可以在没有 JS 的情况下工作。然而ModelForms 通常是提前定义的,而不是动态构建的。我想它们可以即时创建,但这有点棘手。

    【讨论】:

    • 在文档中看不到任何关于为生成的表单字段指定 css 的内容...我在某处错过了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多