gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:27:29 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com