2013-04-11 30 views
1

Я пытаюсь найти лучший подход к тому, что я хочу. И я мог бы использовать некоторую помощь для этого.Django: Виджет поля формы для каждой формы в formet

У меня есть модель А и модель В. Модель B имеет

modela = forms.ForeignKey(Model a) 

Я хочу, чтобы создать представление, где вы можете редактировать и одного Model A и несколько Model B на одной странице. У Django есть формы для этого, и они отлично работают.

У меня есть одна деталь, хотя, что мелочи мелочи немного. А именно - я хочу, чтобы поля виджетов или моделей B были разными, в зависимости от того, какой выбор они сделали в предыдущих полях одного и того же объекта. Потому что - в зависимости от типа виджет должен быть входом для ввода даты или простой текстовой вставки.

Модель B выглядит следующим образом:

class ModelB(models.Model): 
    m0odela = models.ForeignKey(ModelA) 
    target_value = models.CharField() 
    target_type = models.CharField(choices = (there are choices)) 
    target_threshold = models.CharField() 

Я знаю, что я могу представить свою собственную форму для formset и я мог бы сделать это назначение виджета в этой форме.

Но проблема в том, что, когда у formet нет экземпляров/набора запросов, я не могу проверить, был ли задан параметр target_type для экземпляра форм. Поэтому я должен был бы сделать это на основе self.data или self.initial в форме. Но self.initial также нет в form.__init__(). То, с чем я могу работать, - это self.data - но это необработанные запросы.POST или request.GET data - который содержит все ключи, такие как mymodelb_set-0-target_type.

Так что я немного потерялся здесь. Должен ли я выполнять синтаксический анализ ключей и выяснить, какой -target_type принадлежит текущей форме и получить выбранное значение там и назначить виджеты на основе этого значения? Или мне нужно создать собственный подкласс BaseInlineFormSet и переопределить _construc_form там как-то? Таким образом, форма будет иметь начальный ключ со связанными данными в ** kwargs.

Раньше кто-то сталкивался с подобными проблемами?

Алан

ответ

1

Ну я должен был решить, поэтому я решил, что, как хорошо/плохо я мог.

Я создал свой собственный подкласс инлайн formset:

class MyInlineFormSet(BaseInlineFormSet): 
    def _construct_form(self, i, **kwargs): 
     initial = {} 
     fname = '%s-%s-%s' % (self.prefix, i, 'important_field_name') 
     initial['target_type'] = self.data[fname] if fname in self.data.keys() else 'km' 
     kwargs.update({'initial':initial}) 
     form = super(MyInlineFormSet, self)._construct_form(i, **kwargs) 
     return form 

, а затем в классе формы:

class MyNiftyForm(forms.ModelForm): 
    class Meta: 
     model = MyAwesomeObject 
     fields=('field_one', 'field_two', 'field_three') 

    def __init__(self, *args, **kwargs): 
     super(ServiceTargetForm, self).__init__(*args, **kwargs) 
     if self.instance: 
      if self.instance.field_one == 'date': 
       self.fields['field_one'].widget.attrs['class'] = 'datepicker' 
     if self.initial: 
      if self.initial['field_one'] == 'date': 
       self.fields['field_one'].widget.attrs['class'] = 'datepicker' 

и затем в виду:

MySuperCoolFormSet = inlineformset_factory(ImportantObject, MyAwesomeObject, extra = 1, form = MyNiftyForm, formset = MyInlineFormSet) 

И это работает.

Alan

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