Допустим, у меня есть такой вид:Как изменить динамический параметр виджета 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 с контекстной информацией, а не только с его родственным значением поля?