我創建了一個定製構件,它具有一些ajax功能的鏈接。爲了得到這個工作,我需要傳遞我正在編輯的實例的pk。看來小部件無法訪問當前的模型實例(出於很好的理由!),所以我想知道如何獲取這些信息?我需要從uri中獲得嗎?還是有一種方便的方法,我可以忽略它,這將給我所需要的東西。Django - 獲取表單構件類中的實例pk
感謝
我創建了一個定製構件,它具有一些ajax功能的鏈接。爲了得到這個工作,我需要傳遞我正在編輯的實例的pk。看來小部件無法訪問當前的模型實例(出於很好的理由!),所以我想知道如何獲取這些信息?我需要從uri中獲得嗎?還是有一種方便的方法,我可以忽略它,這將給我所需要的東西。Django - 獲取表單構件類中的實例pk
感謝
您可以覆蓋widget的__init__
方法,並傳遞給它的形式實例。從表單實例中可以得到pk(如果存在)。
在這個答案,他們的form_instance結合於形式的初始化小部件。
django - how can I access the form field from inside a custom widget
這裏是另一個問題後談論訪問形式的情況下定製的部件。
Country/State/City dropdown menus inside the Django admin inline
覆蓋,你會使用這個小部件,並設置widget作爲默認插件的模式場。設置默認控件時,實例化控件並傳遞你需要的任何東西。
例如,我重寫ForeignKey類以在選擇輸入之後添加鏈接。
小部件:
class SelectAdd(widgets.Select):
def __init__(self, related_name, related_create_url, attrs=None):
self.related_name = related_name
self.related_create_url = related_create_url
super().__init__(attrs=attrs)
def render(self, name, value, attrs=None, **kwargs):
rendered = super(SelectAdd, self).render(name, value, attrs, **kwargs)
return rendered + mark_safe(u'''
<span>Add new {} : {}</span>
'''.format(self.related_name, self.related_create_url))
和模型領域:
class ForeignKeyAdd(ForeignKey):
def formfield(self, **kwargs):
db = kwargs.pop('using', None)
if isinstance(self.remote_field.model, six.string_types):
raise ValueError("Cannot create form field for %r yet, because "
"its related model %r has not been loaded yet" %
(self.name, self.remote_field.model))
defaults = {
'form_class': forms.ModelChoiceField,
'queryset': self.remote_field.model._default_manager.using(db),
'to_field_name': self.remote_field.field_name,
'widget': SelectAdd(
related_name=self.name,
related_create_url=get_crud_url(self.related_model, 'create')
),
}
defaults.update(kwargs)
return super(ForeignKey, self).formfield(**defaults)
除了選擇答案: 要使用AdvancedModelChoiceField,並通過定期部件仍然呈現形式,我的子類Django的小部件,忽略了一些方法。 第一種方法是optgroups。更換
for index, (option_value, option_label) in enumerate(chain(self.choices)):
與
for index, (option_value, option_label, obj) in enumerate(chain(self.choices)):
然後,我們需要傳遞給OBJ選擇。
def create_option(self, name, value, label, selected, index, subindex=None, attrs=None, obj=None):
option = super(RadioSelect, self).create_option(name, value, label, selected, index, subindex, attrs)
option['obj'] = obj
return option
在控件模板訪問OBJ這樣的:
{{ widget.obj.object_attr }}
最後,我們可以用我們的自定義窗口小部件和現場在我們的形式:
class MyForm(forms.ModelForm):
myfield = AdvancedModelChoiceField(
widget=MyWidget,
queryset=MyModel.objects.all(),
empty_label=None
)