django - 如何将上下文变量从 View 传递到 Django 模板中的自定义字段/小部件?

标签 django django-forms django-views django-widget

我已经为通过子类化 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/

相关文章:

python - 编写我自己的 django-cms 插件。有什么建议吗?

python - 从 Django 路由到 Angular 路由

python - MySQL-Python 安装 - 无法构建鸡蛋

django - 如何将 django-reversion 添加到使用 django 和 django-rest 框架开发的应用程序中

python - Django 接受一个整数到一个 CharField

python - 自定义模板中的 Django ManyToManyField?

django - django 中的模板是如何获取用户对象的?

django - Django 的预输入自动完成

django - 我应该使用 Django 的管理功能吗?

django - 如何在 Django 中显示关系值?