从数据库架构生成自定义表单
我现在在用web2py,但有时候还是会回到Django(我最开始用的框架)。特别是在做一些项目时,我想用一些在web2py中还没有的特定Django应用、插件或扩展。
在web2py中,有一件我离不开的事情,我希望在Django中找到解决办法,那就是从数据库表生成HTML表单,并且能够在视图中自定义它们的外观和布局,而不需要用到JavaScript。
我想要的关键点有:
- 从数据库表生成HTML表单
- 为生成的HTML表单中的每个字段分配自定义的CSS类或ID(不使用JavaScript)
- 通过在视图中的方法调用,将每个表单字段/元素放置在预先制作的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 个回答
如果你还没有看过,建议你去看看Django的ModelForm。我假设你已经有了和数据库表对应的模型。普通的ModelForm
实例在没有JavaScript的情况下也能正常工作。不过,ModelForm
通常是提前定义好的,而不是临时创建的。我想它们是可以临时创建的,但那样会有点复杂。
使用 ModelForm
,然后通过明确声明你想要自定义的字段来覆盖它们。
如果你想设置字段的属性,比如 class
和 id
,你需要像这样做:
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