我正在使用基于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()
除自定义表单字段外,是否还必须创建自定义模型字段,还是可以使用此设置?
答案 0 :(得分:2)
django形式的魔力在于你不需要做所有这些。通过按名称调用表单的选择字段,它将呈现它并根据在即时时传递到表单中的初始/实例数据选择正确的选项。
{{form.working_month}}
如果您仍然遇到麻烦,您也可以发布表单类吗?
祝你好运!修改强>
在查看您发布的链接的第一条评论时,会解决此问题。评论者包含此代码
def __init__(self, *args, **kwargs):
forms.MultiValueField.__init__(self, *args, **kwargs)
self.fields = (forms.CharField(), forms.CharField(),)
答案 1 :(得分:0)