假设有一个简单的文本输入
<input class='employee_list' name='requestor' type='text' />
为了这个
^{pr2}$并使用AJAX+JSON加载隐藏的输入值。问题是,if form.is_valid() is not True
,那么如何创建一个自定义小部件来呈现这两个值?我想我可以做两个不同的领域,但这看起来很难看。我也可以定制表单渲染,但那更糟糕。也许表单可以将所有的POST数据传递给小部件,但似乎无法找到如何使其工作。在
一定有一个优雅的方法来实现这一点!在
from django import forms
class AjaxPickerWidget(forms.TextInput):
def render(self, name, value, attrs=None):
# ... now what?
return super(AjaxPickerWidget, self).render(name, value, attrs=attrs)
我的解决方案
谢谢你的帮助,我采取了不同的方法。由于我严格地将其用于模型(因此需要一个键/值对),所以我让小部件直接与模型交互,并创建一个data-id
属性,jQuery将捕捉该属性以移动到隐藏字段。在
from django import forms
class AjaxPickerModelWidget(forms.TextInput):
def __init__(self, css_class, queryset, id_name, value_name, attrs={}):
attrs['class'] = css_class
self.queryset = queryset
self.id_name = id_name
self.value_name = value_name
super(AjaxPickerModelWidget, self).__init__(attrs=attrs)
def render(self, name, value, attrs={}):
try:
instance = self.queryset.get(**{self.id_name: value})
attrs['data-id'] = value
value = getattr(instance, self.value_name)
except:
value = ''
return super(AjaxPickerModelWidget, self).render(name, value,
attrs=attrs)
好吧,我不知道这是否算优雅,但像这样的东西怎么样。这里我将搜索字符串存储为小部件上的一个属性,并从表单构造函数中的POST数据设置该属性。我还使用name=“foo_picker_text”来指示名为“foo”的相应输入的搜索输入。在
你可能需要稍微调整一下,让属性显示在你想要的地方,等等,但希望这基本上能满足你的需要?在
您可以创建一个自定义函数,而不是在窗体上调用
is_valid()
相关问题 更多 >
编程相关推荐