首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TurboGears2 -如何自定义新用户表单的布局?

TurboGears2 -如何自定义新用户表单的布局?
EN

Stack Overflow用户
提问于 2013-07-18 14:45:49
回答 1查看 575关注 0票数 0

我目前正在使用这个作为我的新用户表单:

代码语言:javascript
复制
class UserForm(AdminPage):
    entity = Model.User
    title = 'User'
    class child(ListForm):
        css_class = 'form-horizontal'
        buttons = [SaveButton(),CancelButton()]
        ...
        phone = TextField(
                label = 'Phone',
                validator = twc.Required
        )
        ...

我假设我必须使用ListForm以外的其他东西来做我想做的事情。我需要的是:

我想自定义某些表单字段的长度,将两个表单字段放在一起而不是在下面,并将这两个字段上的标签更改为出现在字段的上方,而不是它们的左边。

我花了几个小时仔细研究不同版本的tg文档和1.0 API,但没有发现任何有用的地方。我试着补充:

代码语言:javascript
复制
__field_attrs__={'phone':{'rows':'2'}}

但什么都没变。我假设ListForm没有field_attrs!?有人能为我指出正确的方向如何实现我想要的吗?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-18 21:51:33

您可以向字段中添加CSS类和样式,如下所示:

代码语言:javascript
复制
phone = TextField(label='Phone',
                  validator=twc.Required,
                  css_class='MyTextFieldClass',
                  attrs=dict(style='display:block;width:8em', maxlength='12'))

对于完全不同的布局,您需要子类BaseLayout并引用您自己的模板,如下所示:http://tw2core.readthedocs.org/en/latest/design/#template

例如,我创建了一个名为FloatLayout的更灵活的布局类:

代码语言:javascript
复制
from itertools import groupby
from tw2.core import Param
from tw2.forms.widgets import BaseLayout

class FloatLayout(BaseLayout):

    template = "widgets.templates.float_layout"

    aside = Param('All fields aside', default=False)

    def rows(self, children):
        """Create the rows."""
        def row_no(child, no=[0]):
            if not self.aside and not getattr(child, 'aside', False):
                no[0] += 1
            return no[0]
        return groupby(children, row_no)

它可以与这个FloatForm类一起使用:

代码语言:javascript
复制
from tw2.core import Variable
from tw2.forms import Form

class FloatForm(Form):
    """Form using floating divisions allowing multiple fields per row.

    Fields having the 'aside' attribute set appear on the same row.

    Something like the following should be included in the site CSS file:

    form.floatform {
        margin-bottom: 1ex;
    }
    form.floatform div.row {
        clear: left;
        overflow: hidden;
        height: 100%;
        margin-top: 1.5ex;
    }
    form.floatform div.field {
        float: left;
        margin-right: 1em;
    }
    form.floatform label.fieldlabel {
        display: block;
    }
    form.floatform div.submit {
        margin-top: 3ex;
    }

    """

    template = "widgets.templates.float_form"

    child = Variable(default=FloatLayout)

    css_class = "floatform"

用于float_layout.html的Genshi模板是这样的:

代码语言:javascript
复制
<div xmlns:py="http://genshi.edgewall.org/" py:attrs="w.attrs" py:strip="True">
    <div py:for="row_no, row in w.rows(w.children_non_hidden)"
            class="${row_no % 2 and 'odd' or 'even'} row">
        <div py:for="child in row" py:attrs="child.container_attrs"
            class="field${child.validator and
                getattr(child.validator, 'required', None) and ' required' or ''}"
            title="${w.hover_help and w.help_text or ''}">
            <label py:if="child.label" for="${child.attrs.get('id')}"
                class="fieldlabel" py:content="child.label"/>
            <span py:replace="child.display()"/>
            <span py:if="not w.hover_help and child.help_text"
                class="fieldhelp" py:content="child.help_text"/>
            <span py:if="child.error_msg"
                class="fielderror" py:content="child.error_msg"/>
        </div>
    </div>
    <div py:if="w.children_hidden" style="display:none">
        <div py:for="child in w.children_hidden" py:replace="child.display()"/>
    </div>
</div>

用于float_form.html的Genshi模板是这样的:

代码语言:javascript
复制
<form xmlns:py="http://genshi.edgewall.org/"
    class="floatform" py:attrs="w.attrs">
    <div py:if="w.error_msg" class="formerror" py:content="w.error_msg"/>
    <div py:if="w.help_msg" class="formhelp"><p py:content="w.help_msg"/></div>
    <div py:replace="w.child.display()"/>
    <div py:for="button in w.buttons" class="field" py:content="button.display()"/>
</form>

一个具体的形式现在可以如下所示:

代码语言:javascript
复制
class UserForm(FloatForm):
    action = url('save_user')
    submit = SubmitButton('Save user')
    user_id = HiddenField(validator=IntValidator())
    user_name = TextField(validator=UserNameValidator(max=16),
        size=20, maxlength=16, label=u'User name:')
    remote_account = CheckBox(validator=BoolValidator(),
        label=u'Remote account:', aside=True)
    new_password = PasswordField(
        validator=PasswordValidator(required=False),
        size=20, maxlength=16, label=u'Password:', aside=True)
    group_id = CheckBoxList(item_validator=IntValidator(),
        label=u'Roles:', css_class='inline')
    display_name = TextField(validator=NameValidator(max=255),
        size=64, maxlength=255, label=u'Real name:')
    mail = TextField(validator=EmailIfLocalValidator(),
        size=64, maxlength=255, label=u'Email address:')

正如您所看到的,字段remote_accountnew_password有一个属性aside,它使它们出现在与user_name相同的行上。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17726700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档