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

标签 python django django-templates django-forms

我正在使用基于 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>

预先感谢大家提供的任何指导。

编辑:这是通用 View :

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

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

最佳答案

django 表单的神奇之处在于您不需要做所有这些事情。通过按名称调用表单的选择字段,它将呈现该字段并根据实例时传递到表单中的初始/实例数据选择正确的选项。

{{form.working_month}}

如果您仍然遇到问题,您可以也发布表单类吗?

祝你好运!

编辑

在查看您发布的链接上的第一条评论时,此问题已得到解决。评论者包含了这段代码

def __init__(self, *args, **kwargs):
  forms.MultiValueField.__init__(self, *args, **kwargs)
  self.fields = (forms.CharField(), forms.CharField(),)

关于python - Django:迭代自定义选择字段中的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1975411/

相关文章:

python - 线程化的 Django 任务不会自动处理事务或数据库连接?

python - 如何显示按外键分组的对象

python - 无法将页面从主页转移到关于页面

python - 有没有办法让 python pickle 忽略 "it' s not the same object“错误

python - FileNotFoundError : [Errno2]: No Such file or directory:

python - 使用 Marketo API 的结果不一致 - 无法找到事件 ID

python - 在 Django 模板中使用小数点和有限小数部分格式化 float

python - 捕获非整个训练、测试和验证分割中的所有数据

python - Django Model.objects.all().delete() 没有完成

python - 在 Lion-mountain (Mac OS X 10.8) 上安装 MYSQL-python 时出现 clang 错误