. . , , . , , , Django , , , - .
somelibrary/templatetags/widgethack.py:
from django import template
register = template.Library()
class _WidgetContextWrapper(object):
def __init__( self, widget=None, context=None ):
self.widget = widget
self.context = context
def __getattr__( self, attr ):
return getattr( self.widget, attr )
def render( self, name, value, attrs=None ):
try:
return self.widget.render( name, value, attrs=attrs, context=self.context )
except TypeError:
return self.widget.render( name, value, attrs=attrs )
def contextfield( context, field ):
return field.as_widget( widget=_WidgetContextWrapper( field.field.widget, context ) )
register.simple_tag(takes_context=True)(contextfield)
:
{% load widgethack %}
{% contextfield some_field %}
, , , , render, context=:
from django import forms
from django.template.loader import render_to_string
from django.template.context import Context
class MyWidget( forms.widgets.TextInput ):
def render( self, name, value, attrs=None, context=None ):
attrs = attrs if attrs else {}
context = context if context else Context()
context.push()
context["do_what"]="you_want"
rendered = render_to_string("just_for_example.html",context)
context.pop()
return rendered
:
from django import forms
from wherever import MyWidget
class MyModelForm( forms.ModelForm )
my_field = forms.CharField( widget=MyWidget )
...
Alas, the one big drawback that I find in Django is that many classes really need to be classes that allow you to override inner classes such as BoundField, ModelFormOptions and the classes that formet_factory and others return .: -P </rant>