The documentation is a bit lacking with respect to this feature.
from django import forms
class TwoInputWidget(forms.MultiWidget):
"""An example widget which concatenates two text inputs with a space"""
def __init__(self, attrs=None):
widgets = [forms.TextInput, forms.TextInput]
Run Code Online (Sandbox Code Playgroud)
我可以看到我需要创建一个带有其他小部件列表的"小部件"属性,但之后它会得到一个小福尔摩斯.
有人请向我解释如何使用MultiWidget小部件吗?
所以我的django书又回到了大学,我正在努力解决这个问题.
我的子类django.forms.widgets.MultiWidget是这样的:
class DateSelectorWidget(widgets.MultiWidget):
def __init__(self, attrs=None, dt=None, mode=0):
if dt is not None:
self.datepos = dt
else:
self.datepos = date.today()
# bits of python to create days, months, years
# example below, the rest snipped for neatness.
years = [(year, year) for year in year_digits]
_widgets = (
widgets.Select(attrs=attrs, choices=days),
widgets.Select(attrs=attrs, choices=months),
widgets.Select(attrs=attrs, choices=years),
)
super(DateSelectorWidget, self).__init__(_widgets, attrs)
def decompress(self, value):
if value:
return [value.day, value.month, value.year]
return [None, None, None]
def format_output(self, rendered_widgets):
return u''.join(rendered_widgets)
Run Code Online (Sandbox Code Playgroud)
这给了我一个漂亮的日期选择字段,如下所示: …
我似乎无法弄清楚如何在Django中正确处理以下情况:
我在模型中有一个日期范围,我将其存储为两个单独的字段,date_start并且date_end:
start_date = models.DateTimeField()
end_date = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
在此模型的表单中,我想将其表示为一个字段,带有一个标签:
timespan = forms.Field(widget=widgets.SelectDateRangeWidget(), label="Date Range")
Run Code Online (Sandbox Code Playgroud)
就像现在一样,我扩展了MultiWidget以创建SelectDateRangeWidget:
class SelectDateRangeWidget(forms.MultiWidget):
...
Run Code Online (Sandbox Code Playgroud)
然后包含两个Date小部件.我想使用它,但随后将其清理为两个单独的模型字段,并保留将初始数据加载到表单字段的功能.是每次手动设置initial为这两个字段的值的唯一方法,可能__init__是在表单的功能中,还可以手动将其清理为这两个模型字段,或者是否有更清洁(可以这么说)的方式来执行此操作?
这一切都是新手!我正在努力在前端显示显示为 (xxx)xxx-xxxx 的电话字段。下面是我的代码。我的问题是 1. 所有字段都是必填的,由于某种原因,手机的行为不符合预期。即使留空也不会抱怨 2.我如何测试这个小部件的功能
class USPhoneNumberWidget(forms.MultiWidget):
def __init__(self,attrs=None):
widgets = (forms.TextInput(attrs={'size':'3','maxlength':'3'}),forms.TextInput(attrs={'size':'3','maxlength':'3'}),forms.TextInput(attrs={'size':'3','maxlength':'4'}))
super(USPhoneNumberWidget,self).__init__(widgets,attrs=attrs)
def decompress(self, value):
if value:
val = value.split('-')
return [val[0],val[1],val[2]]
return [None,None,None]
def compress(self, data_list):
if data_list[0] and data_list[1] and data_list[2]:
ph1 = self.check_value(data_list[0])
ph2 = self.check_value(data_list[1])
ph3 = self.check_value(data_list[2])
return '%s''%s''%s' %(ph1,ph2,ph3)
else:
return None
def check_value(self,val):
try:
if val.isdigit():
return val
except:
raise forms.ValidationError('This Field has to be a number!')
def clean(self, value):
try:
value = re.sub('(\(|\)|\s+)','',smart_unicode(value))
m = phone_digits_re.search(value)
if m:
return u'%s%s%s' …Run Code Online (Sandbox Code Playgroud) 我试图了解如何通过继承 MultiWidgets 和 MultiValueFields 来创建表单。我有一个简单的地址模型和相关表格:
class Address(models.Model):
user = models.ForeignKey(User)
city = models.CharField(max_length=255)
state = models.CharField(choices = settings.STATES, max_length=50)
postal = models.CharField(max_length=10)
address = models.TextField()
class Meta:
verbose_name_plural = 'Addresses'
class AddressFieldWidget(forms.MultiWidget):
def decompress(self,value):
if value:
return [value[0],value[1],value[2]]
return ''
def format_output(self, rendered_widgets):
str = ''
line_1 = '<td class="align_left"><label for="contact_phone">Address Line 1</label></td>'
for field in rendered_widgets:
str += '<tr>' + line_1
str += '<td class="align_right">%s</td></tr>' % field
return '<tr>' + str + '</tr>'
def value_from_datadict(self,data,files,name):
line_list = [widget.value_from_datadict(data,files,name+'_%s' %i) …Run Code Online (Sandbox Code Playgroud)