作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经为通过子类化 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/
我是一名优秀的程序员,十分优秀!