首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django-crispy-forms中创建控件-行

在django-crispy-forms中创建控件-行
EN

Stack Overflow用户
提问于 2013-02-20 18:09:15
回答 3查看 4.7K关注 0票数 6

使用django-crispy-forms,我想在一行中组合两个(或更多)小部件。另请参阅附加的示例。我认为使用该库应该是可行的,尽管文档中确实包含了关于此问题的示例,并且源代码也没有帮助。那么,有没有人设法使用django-crispy-forms得到类似的结果呢?

这样的表单所需的HTML如下所示:

代码语言:javascript
复制
<div class="control-group">
    <label for="desc" class="control-label">
        Description
    </label>
    <div class="controls controls-row">
        <input class="span2" maxlength="255" type="text" id="desc">
        <input class="span3" maxlength="255" type="text">
    </div>
</div>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-20 22:54:43

你可以在‘`def init(self,*args,**kwargs):in layout object中定义HTML对象。这个HTML将为你提供所有你想要的自由。

还有另一种方法。要在templates文件夹中实际创建自己的模板,然后在layout对象中定义该模板的路径示例:

代码语言:javascript
复制
Field('name', template='path/to/template/single_line_input.html'),

其中'name‘实际上是一个小部件。

当然,你可以尝试在你的应用程序中使用CSS文件,像float: leftdisplay: inline这样的东西可能会有帮助,但你必须在应该以内联方式显示的小部件上定义类。对于不擅长前端CSS的人来说,这可能有点棘手(因为结果在不同的浏览器和不同的分辨率上可能是不同的,所以不用说需要一些测试)。您遇到的问题主要是浏览器默认情况下将输入字段呈现为块对象,因此它们在一行中占据了所有空间,即使它们的宽度较小。

票数 3
EN

Stack Overflow用户

发布于 2013-02-20 23:23:13

是。使用Layouts

下面是一个示例代码片段,可以帮助您进行操作。

代码语言:javascript
复制
def __init__(self, *args, **kwargs):
    self.helper = FormHelper()
    self.helper.form_method = 'get'
    self.helper.form_id = 'id_search'
    self.helper.layout = Layout(
            Div(
                Div(Field('arrival_date', css_class='span12 input-large calendar',
                    placeholder='dd/mm/yyyy'), css_class='span5'),
                Div(Field('departure_date', css_class='span12 input-large calendar',
                    placeholder='dd/mm/yyyy'), css_class='span5'),
                Div(Field('rooms', css_class='span12'), css_class='span2 styled-rooms'),
                css_class='row-fluid',
            ),
        )
票数 7
EN

Stack Overflow用户

发布于 2013-03-03 02:49:50

您可以使用MultiValueFieldMultiWidget来获得此行为。您将需要考虑并修改compressdecompress方法,但下面的内容应该可以帮助您实现这一目标。

代码语言:javascript
复制
from django import forms
from crispy_forms.helper import FormHelper

class MyWidget(forms.MultiWidget):
    widgets = (forms.TextInput(), forms.TextInput())
    super(ExpirationDateWidget, self).__init__(widgets)

    def decompress(self, value):
        if value:
            return value.split('|')  # or however you combined the two values
        return [None, None]


class MyMultiField(forms.MultiValueField):
    def __init__(self, *args, **kwargs):
        self.widget = MyWidget(*args, **kwargs)

    def compress(self, data_list):
        return data_list[0] + '|' + data_list[1]  # or other logical compression


class MyForm(forms.Form):
    multi_field = MyMultiField()
    # other fields like category and category_new

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_class = 'form-horizontal'
        self.helper.layout = Layout('multi_field', 'category', 'category_new')

这将导致类似如下的结果:

代码语言:javascript
复制
 <div id="div_id_multi_field" class="control-group">
     <label for="id_multi_field_0" class="control-label">Multi Field</label>
     <div class="controls">
         <input id="id_multi_field_0">
         <input id="id_multi_field_1">
     </div>
 </div>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14977157

复制
相关文章

相似问题

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