2011-02-07 4 views
1

У меня сильный фон в PHP/ZEND, и теперь я использую изучение Python/Django. В Zend вы можете взять объект элемента формы и в любое время отредактировать его. Это здорово, потому что вы можете взять объект формы и внести небольшие изменения в него по требованию, не создав полностью новый объект формы. Я пытаюсь это сделать в Django.Python/Django - Редактировать формы модели после создания

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

т.е.

form = VoteForm(initial={}) 
## then something like 
form.field.widget = newWidget 

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

ответ

4

Вы ответили на свой вопрос: это (почти) именно то, как вы это делаете!

# tested on 1.2.3 
form = VoteForm(initial={}) 
form.fields['field_name'].widget = forms.HiddenInput() # make sure you call widget() 

form.as_p() # shows new widget 
+0

Я пробовал этот метод без успеха. У меня есть поле, которое я хочу скрывать. Элемент формы не отображается как скрытый, когда я применяю эту технику. Не могли бы вы привести мне пример того, как вы это сделаете в джанго? (как вы используете встроенные виджеты?) – GregL83

+0

Hey GregL83, этот код работает (протестирован только сейчас на 1.2.3). Какой тип поля вы пытаетесь скрыть? Кроме того, убедитесь, что вы вызываете виджет **() ** –

+0

поле формы "title = forms.CharField (label =" Header ", required = True)", и я делаю: form ['title']. Widget = forms.HiddenInput() – GregL83

1

Другой способ заключается в переопределении метода форме в инициализации(), что-то вроде:

class VoteForm(forms.Form): 
    myfield = ... 
    def __init__(self, hide_field=False, *args, **kwargs): 
     super(VoteForm, self).__init__(*args, **kwargs) 
     if hide_field: 
      self.fields['myfield'].widget = ... 

form = VoteForm(hide_field=True, initial={}) 

Я лично предпочитаю этот метод, сохраняет все формы логики в одном месте вместо распространения вокруг. Предполагая, что ваши формы и представления находятся в отдельных файлах, вам не нужно будет делать несколько «из форм импорта django», чтобы получить виджеты в представлениях.

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