gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:18:24 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com