【发布时间】:2010-12-30 19:56:44
【问题描述】:
我正在使用基于 this example 的自定义 MM/YY 字段和小部件。我想遍历小部件类中定义的各个月份和年份选项,以便将“selected='selected'”应用于与存储在数据库中的 MM/YY 值相对应的 MM/YY 值。这似乎是一种混乱的方式,所以如果您有更好的想法,请在此处发布。
class MonthYearWidget(forms.MultiWidget):
def __init__(self, attrs=None):
months = (
('01', 'Jan (01)'),
('02', 'Feb (02)'),
('03', 'Mar (03)'),
('04', 'Apr (04)'),
('05', 'May (05)'),
('06', 'Jun (06)'),
('07', 'Jul (07)'),
('08', 'Aug (08)'),
('09', 'Sep (09)'),
('10', 'Oct (10)'),
('11', 'Nov (11)'),
('12', 'Dec (12)'),
)
year = int(datetime.date.today().year)
year_digits = range(year, year+10)
years = [(year, year) for year in year_digits]
widgets = (forms.Select(attrs=attrs, choices=months), forms.Select(attrs=attrs, choices=years))
super(MonthYearWidget, self).__init__(widgets, attrs)
def decompress(self, value):
if value:
return [value.month, value.year]
return [None, None]
def render(self, name, value, attrs=None):
try:
value = datetime.date(month=int(value[0]), year=int(value[1]), day=1)
except:
value = ''
return super(MonthYearWidget, self).render(name, value, attrs)
class MonthYearField(forms.MultiValueField):
def __init__(self, *args, **kwargs):
forms.MultiValueField.__init__(self, *args, **kwargs)
self.fields = (forms.CharField(), forms.CharField(),)
def compress(self, data_list):
if data_list:
return datetime.date(year=int(data_list[1]), month=int(data_list[0]), day=1)
return datetime.date.today()
然后这就是我在模板中遇到的问题。我无法弄清楚月份和年份的可迭代列表的名称是什么(如果有的话)。发现可迭代列表是问题所在;我已经计划使用 ifequal 语句来确定“selected='selected'”应该应用于哪个选项。到目前为止,我只尝试过几个月的迭代。
<form action="#" method="POST">
{% csrf_token %}
<p>{{ form.from_email.label_tag }}: {{ form.from_email }}</p>
<p>{{ form.working_month.label_tag }}:
<select name="working_month_0" id="id_working_month_0">
{% for i in form.working_month.data_list %}
<option value="{{ i }}">{{ option.from_email }}</option>
{% endfor %}
</select>
<p><input type="submit" value="Change Settings Now" /></p>
</form>
提前感谢大家提供的任何指导。
编辑:这是通用视图:
def option_edit(request,option_id):
try:
option = Option.objects.get(pk=option_id)
except Option.DoesNotExist:
raise Http404
return create_update.update_object(
request,
form_class = OptionForm,
template_name = 'options.html',
template_object_name = 'option',
object_id = option_id,
post_save_redirect = '/some/address/' + option_id + '/edit/'
)
...和表单类:
class OptionForm(ModelForm):
class Meta:
model = Option
working_month = MonthYearField(widget=MonthYearWidget)
我认为该模型也很相关:
class Option(models.Model):
from_email = models.EmailField()
working_month = models.DateField()
除了自定义表单字段之外,我是否必须创建自定义模型字段,还是可以使用此设置?
【问题讨论】:
标签: python django django-templates django-forms