2009-12-29 5 views
1

Я использую настраиваемое поле и виджет 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() 

Нужно ли создавать поле настраиваемой модели в дополнение к настраиваемому полю формы или использовать эту настройку?

ответ

2

Магия форм джанго - это то, что вам не нужно все это делать. Вызвав поле выбора формы по имени, оно отобразит его и выберет правильный вариант, основываясь на исходных данных/экземплярах, переданных в форму при создании.

{{form.working_month}} 

Если у вас все еще есть проблемы, можете ли вы опубликовать класс формы?

Удачи вам!

EDIT

Глядя на первый комментарий по этой ссылке, Вы в курсе, эта проблема решена. Комментатора включил этот код

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

Ну, проблема в том, что {{}} form.working_month всегда отображает первый вариант, январь, 2009, хотя фактические данные MM/YY в базе данных - август 2010 года. Я опубликовал общий вид, который я использую, а также класс формы. Благодарю. – John

+1

Вы заполняете форму экземпляром? Если это так, я думаю, проблема связана с вашим переопределенным методом render() - вам это нужно? – Tom

+0

Выполняют ли другие поля формы с правильными исходными данными? – czarchaic

Смежные вопросы