从数据库架构生成自定义表单

1 投票
2 回答
585 浏览
提问于 2025-04-16 02:28

我现在在用web2py,但有时候还是会回到Django(我最开始用的框架)。特别是在做一些项目时,我想用一些在web2py中还没有的特定Django应用、插件或扩展。

在web2py中,有一件我离不开的事情,我希望在Django中找到解决办法,那就是从数据库表生成HTML表单,并且能够在视图中自定义它们的外观和布局,而不需要用到JavaScript。

我想要的关键点有:

  1. 从数据库表生成HTML表单
  2. 为生成的HTML表单中的每个字段分配自定义的CSS类或ID(不使用JavaScript)
  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

上面的代码从数据库表中创建一个HTML表单,然后让我把每个单独的表单字段放在我想要的预制HTML中的任何位置(使用那些在传递的“form”对象上的“自定义”方法调用)。包括我为生成的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的管理后台。如果有Pylons的解决方案也欢迎!

如果能提供相关文章、教程或操作指南的链接,我将非常感激。同时,请用你提到的方法给出上述代码的等效结果...

2 个回答

1

如果你还没有看过,建议你去看看Django的ModelForm。我假设你已经有了和数据库表对应的模型。普通的ModelForm实例在没有JavaScript的情况下也能正常工作。不过,ModelForm通常是提前定义好的,而不是临时创建的。我想它们是可以临时创建的,但那样会有点复杂。

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

撰写回答