Django 表单小部件渲染

1 投票
1 回答
2533 浏览
提问于 2025-04-16 15:36

大家好,我想创建一个小工具,让它显示一个手机号码的输入框,格式如下:

box - box2 - box3

我试过这个网站上提供的不同代码片段,但它们没有覆盖HTML的显示方式,这正是我想要的。

比如说这个:

class USPhoneNumberMultiWidget(forms.MultiWidget):
"""
A Widget that splits US Phone number input into three <input type='text'> boxes.
"""
def __init__(self,attrs=None):
    widgets = (
        forms.TextInput(attrs={'size':'3','maxlength':'3', 'class':'phone'}),
        forms.TextInput(attrs={'size':'3','maxlength':'3', 'class':'phone'}),
        forms.TextInput(attrs={'size':'4','maxlength':'4', 'class':'phone'}),
    )
    super(USPhoneNumberMultiWidget, self).__init__(widgets, attrs)

def decompress(self, value):
    if value:
        return value.split('-')
    return (None,None,None)

def value_from_datadict(self, data, files, name):
    value = [u'',u'',u'']
    # look for keys like name_1, get the index from the end
    # and make a new list for the string replacement values
    for d in filter(lambda x: x.startswith(name), data):
        index = int(d[len(name)+1:]) 
        value[index] = data[d]
    if value[0] == value[1] == value[2] == u'':
        return None
    return u'%s-%s-%s' % tuple(value)

会显示成一个HTML输入框:

box|box2|box3

那么我该怎么做才能改变这个显示方式,让它变成:

box - box2 - box3

如果能提供一些关于如何创建自定义小工具的文档,我会非常感激,目前我还没有找到相关资料。

models.py:

class Preference(models.Model):
    phone = models.PositiveIntegerField(blank=True)

class PreferenceForm(ModelForm):

    class Meta:
        model = Preference
        widgets = {
            'phone':USPhoneNumberMultiWidget(attrs={'class':'firstnumberbox', 'id':'firstcellphone', 'name':'firstphone'}),

显示的HTML:

<dt><label for="firstcellphone"> Cell Phone:</label></dt> 
        <dd class="phones"><input name="firstphone" id="firstcellphone_0" maxlength="3" type="text" class="firstnumberbox" size="3" /> - <input name="firstphone" id="firstcellphone_1" maxlength="3" type="text" class="firstnumberbox" size="3" /> - <input name="firstphone" id="firstcellphone_2" maxlength="4" type="text" class="firstnumberbox" size="4" /></dd>

1 个回答

2

你可以重写MultiWidget的format_output方法:

def format_output(self, rendered_widgets):
        return u'%s - %s - %s' % \
            (rendered_widgets[0], rendered_widgets[1], rendered_widgets[2])

关于自定义表单小部件的文档并不多。我只做过几个,花了很多时间调试。希望这对你有帮助!

撰写回答