Я использую настраиваемое поле и виджет MM/YY на основе this example. Я хочу перебрать отдельные параметры месяца и года, определенные в классе виджетов, чтобы применить «selected = 'selected» к значению MM/YY, которое соответствует значению MM/YY, хранящемуся в базе данных. Это похоже на такой грязный способ сделать это, поэтому, если у вас есть какие-то лучшие идеи, пожалуйста, разместите их здесь.Django: повторение параметров в настраиваемом поле выбора
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>
Заранее благодарим за любые указания, которые вы можете предоставить.
EDIT: Вот общий вид:
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()
Нужно ли создавать поле настраиваемой модели в дополнение к настраиваемому полю формы или использовать эту настройку?
Ну, проблема в том, что {{}} form.working_month всегда отображает первый вариант, январь, 2009, хотя фактические данные MM/YY в базе данных - август 2010 года. Я опубликовал общий вид, который я использую, а также класс формы. Благодарю. – John
Вы заполняете форму экземпляром? Если это так, я думаю, проблема связана с вашим переопределенным методом render() - вам это нужно? – Tom
Выполняют ли другие поля формы с правильными исходными данными? – czarchaic