Django:迭代自定义选择字段中的选项

2024-10-01 07:17:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用基于this example的自定义MM/YY字段和小部件。我想迭代widget类中定义的月份和年份选项,以便将“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()

这就是我被困在模板里的地方。我搞不清年月的iterable列表的名称是什么(如果有的话)。找到iterable列表是个问题;我已经计划使用ifequal语句来确定“selected='selected'”应该应用于哪个选项。到目前为止,我只试着重复几个月。在

^{pr2}$

提前感谢你们的指导。在

编辑:以下是通用视图:

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()

除了自定义表单字段之外,我是否必须创建自定义模型字段,或者可以使用此设置?在


Tags: selfidreturninitvaluedefformsyear
2条回答

django表单的魔力在于,您不需要做所有这些。通过按名称调用表单的select字段,它将呈现该字段并根据实例化时传递给表单的初始/实例数据选择正确的选项。在

{{form.working_month}}

如果你仍然有麻烦,你能把表格课也贴出来吗?在

祝你好运!在

编辑

看看你发布的链接的第一条评论,这个问题就解决了。注释者包含了这段代码

^{pr2}$

相关问题 更多 >