我已经为通过子类化 UpdateView
提供的表单定义了一个自定义字段和小部件。 .所以,像这样:myapp/forms.py
:
from .form_fields import MyCustomField
from .widgets import MyCustomWidget
class MyModelForm(forms.ModelForm):
my_field = MyCustomField(queryset=MyModel.objects.all(), widget=MyCustomWidget)
myapp/views.py
:from django.views.generic import UpdateView
from .forms import MyModelForm
class MyView(UpdateView):
form_class = MyModelForm
myapp/widgets.py
:from django.forms import Widget
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
class MyCustomWidget(Widget):
context_data = { 'custom_data': custom_data }
html_output = render_to_string('myapp/widgets/my_custom_widget.html', context_data)
return mark_safe(html_output)
基本上,我希望能够通过
custom_data
从我的观点(例如从 session 存储或表单实例)到小部件。
最佳答案
我想到了;我不完全确定这是否是最好/推荐的方法,但它有效。
首先在 View 中更新get_form_kwargs()
与自定义数据。例如,在我的情况下,我想使用附加到表单的实例中的额外数据。
# myapp/views.py
from .forms import MyModelForm
class MyView(UpdateView):
form_class = MyModelForm
def get_form_kwargs(self):
kwargs = super(MyView, self).get_form_kwargs()
form_instance = kwargs.get('instance')
extra_widget_data = form_instance.widget_data
kwargs.update({ 'extra_widget_data': extra_widget_data })
return kwargs
接下来,在您表单的
__init__()
中,弹出 kwarg 并将其附加到字段上的自定义小部件:# myapp/forms.py
from django import forms
from .widgets import MyCustomWidget
class MyModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
extra_widget_data = kwargs.pop('extra_widget_data')
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields['my_custom_field'] = MyCustomField(
widget=MyCustomWidget(extra_widget_data=extra_widget_data)
)
最后,在您的自定义小部件类中,获取
__init__()
中的变量:# myapp/widgets.py
from django.forms import Widget
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
class MyCustomWidget(Widget):
def __init__(self, attrs=None, extra_widget_data=None):
super(MyCustomWidget, self).__init__()
self.extra_widget_data = extra_widget_data
def render(self, name, value, attrs=None):
context_data = { 'custom_data': self.extra_widget_data }
html_output = render_to_string('myapp/widgets/my_custom_widget.html', context_data)
return mark_safe(html_output)
现在
{{ custom_data }}
模板变量在来自 myapp/widgets/my_custom_widget.html
的渲染 HTML 中可用.
关于django - 如何将上下文变量从 View 传递到 Django 模板中的自定义字段/小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20502019/