2013-03-28 3 views
0

Допустим, у меня есть такой вид:Как изменить динамический параметр виджета django?

class ChangeParentCIForm(ModelForm): 
    class Meta: 
     model = CINodeInventory 
     fields = ('parent',) 
     widgets = {'parent': AutocompleteWidget('inventory.uuid'),} 

Проблема заключается в том, что в моем случае, содержание AutocompleteWidget должно быть контекстная не только со значением поля «родительского», но и с информацией сеанса пользователя (для меня номер версии базы данных, выбранный пользователем на другой странице)

чтобы сделать это, я сделал что-то вроде этого в поле зрения классовой основе:

class CompanyManageChangeParentCIView(CompanySelectedMixin,CIContextMixin,CompanyViewCIMixin,UpdateView):  
    template_name = 'inventory/browse_change_parent_ci.html' 
    context_object_name = 'ci' 
    form_class = ChangeParentCIForm 

    def get_form(self,form_class): 
     form = super(CompanyManageChangeParentCIView,self).get_form(form_class) 
     form.base_fields['parent'].widget.url_params={'version':self.request.session['use_version']} 
     return form 

конечно я изменил AutocompleteWidget код, чтобы заботиться этого дополнительного параметра url_params.

Это работает, но этот код мне не очень красив, потому что он изменяет виджет, созданный во время init, для поля, которое также генерируется во время init. с anothers словами, если вы создали 2 формы экземпляров, она указывает на те же поля и виджеты, так что, если я это сделать:

def get_form(self,form_class): 
    form1 = super(CompanyManageChangeParentCIView,self).get_form(form_class) 
    form2 = super(CompanyManageChangeParentCIView,self).get_form(form_class) 
    form1.base_fields['parent'].widget.url_params="val1" 
    form2.base_fields['parent'].widget.url_params="val2" 
    print id(form1),id(form1.base_fields['parent'].widget) 
    print id(form2),id(form2.base_fields['parent'].widget) 

можно увидеть Form1 и Form2 есть в различные инстанции, но они указывают на одинаковые виджеты (и те же поля, если вывести их идентификатор). Поэтому для меня, если я покажу формы1 и form2 в одном шаблоне, я покажу 2 виджета «AutocompleteWidget», но оба настроены с последней модификацией, то есть url_parms = «val2»

Даже если я покажу одну форму, мне кажется очень опасным, что происходит, если 2 потока выполняют один и тот же код с двумя разными значениями «url_params» для одного и того же виджета?

Итак, вот мой вопрос: как настроить рендеринг виджета django с контекстной информацией, а не только с его родственным значением поля?

ответ

2

Поскольку вы меняете form.base_fields, который разделяют все экземпляры класса. Не делайте этого, измените form.fields, который специфичен для экземпляра.

В самом стиле, я бы предпочел, чтобы сделать это в __init__ метод самой формы, и передать URL из параметров, как форма kwarg - выглядит, как вы можете переопределить get_form_kwargs метод мнение, чтобы сделать это, то вам не нужно будет менять get_form.

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