add an form element plugin override example

This commit is contained in:
Artur Barseghyan 2015-03-09 23:48:42 +01:00
parent a83649dc17
commit 3afeaa2c6e
9 changed files with 160 additions and 8 deletions

View file

@ -0,0 +1,67 @@
from django.db import models
from django.forms.models import ModelChoiceField
from django.forms.widgets import Select
from django.utils.translation import ugettext_lazy as _
from fobi.base import FormFieldPlugin, form_element_plugin_registry, get_theme
from fobi.helpers import safe_text
from fobi.contrib.plugins.form_elements.fields.select_model_object import UID
from override_select_model_object_plugin.forms \
import SelectModelObjectInputForm
theme = get_theme(request=None, as_instance=True)
class SelectModelObjectInputPlugin(FormFieldPlugin):
"""
Select model object field plugin.
"""
uid = UID
name = _("Select model object")
group = _("Fields")
form = SelectModelObjectInputForm
def get_form_field_instances(self):
"""
Get form field instances.
"""
app_label, model_name = self.data.model.split('.')
model = models.get_model(app_label, model_name)
queryset = model._default_manager.all()
kwargs = {
'label': self.data.label,
'help_text': self.data.help_text,
'initial': self.data.initial,
'required': self.data.required,
'queryset': queryset,
'widget': Select(attrs={'class': theme.form_element_html_class}),
}
return [(self.data.name, ModelChoiceField, kwargs)]
def submit_plugin_form_data(self, form_entry, request, form):
"""
Submit plugin form data/process.
:param fobi.models.FormEntry form_entry: Instance of
``fobi.models.FormEntry``.
:param django.http.HttpRequest request:
:param django.forms.Form form:
"""
# Get the object
obj = form.cleaned_data.get(self.data.name, None)
if obj:
# Handle the submitted form value
value = '{0}'.format(
safe_text(obj)
)
# Overwrite ``cleaned_data`` of the ``form`` with object qualifier.
form.cleaned_data[self.data.name] = value
# It's critically important to return the ``form`` with updated
# ``cleaned_data``
return form
form_element_plugin_registry.register(SelectModelObjectInputPlugin, force=True)

View file

@ -0,0 +1,63 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
from fobi.base import BaseFormFieldPluginForm, get_theme
from fobi.helpers import get_registered_models
from fobi.contrib.plugins.form_elements.fields.select_model_object.settings \
import IGNORED_MODELS
theme = get_theme(request=None, as_instance=True)
class SelectModelObjectInputForm(forms.Form, BaseFormFieldPluginForm):
"""
Form for ``SelectModelObjectPlugin``.
"""
plugin_data_fields = [
("label", ""),
("name", ""),
("model", ""),
("help_text", ""),
("initial", ""),
("required", False)
]
label = forms.CharField(
label = _("Label"),
required = True,
widget = forms.widgets.TextInput(attrs={'class': theme.form_element_html_class})
)
name = forms.CharField(
label = _("Name"),
required = True,
widget = forms.widgets.TextInput(attrs={'class': theme.form_element_html_class})
)
model = forms.ChoiceField(
label = _("Model"),
choices = [],
required = False,
widget = forms.widgets.Select(attrs={'class': theme.form_element_html_class})
)
help_text = forms.CharField(
label = _("Help text"),
required = False,
widget = forms.widgets.Textarea(attrs={'class': theme.form_element_html_class})
)
initial = forms.CharField(
label = _("Initial"),
required = False,
widget = forms.widgets.TextInput(attrs={'class': theme.form_element_html_class})
)
required = forms.BooleanField(
label = _("Required"),
required = False,
widget = forms.widgets.CheckboxInput(attrs={'class': theme.form_element_checkbox_html_class})
)
def __init__(self, *args, **kwargs):
"""
In order to avoid static calls to `get_registered_models`.
"""
super(SelectModelObjectInputForm, self).__init__(*args, **kwargs)
self.fields['model'].choices = get_registered_models(
ignore = IGNORED_MODELS
)

View file

@ -0,0 +1,2 @@
#workon fobi
./manage.py runserver 0.0.0.0:8003 --settings=settings_override_select_model_object_plugin --traceback -v 3

View file

@ -1,2 +1,2 @@
#workon fobi
./manage.py runserver 0.0.0.0:8003 --settings=settings_override_simple_theme --traceback -v 3
./manage.py runserver 0.0.0.0:8003 --settings=settings_override_simple_theme --traceback -v 3

View file

@ -0,0 +1,16 @@
from nine.versions import DJANGO_GTE_1_7
from settings import *
INSTALLED_APPS = list(INSTALLED_APPS)
try:
INSTALLED_APPS.append('override_select_model_object_plugin')
except Exception as e:
pass
if DJANGO_GTE_1_7:
try:
INSTALLED_APPS.remove('south') if 'south' in INSTALLED_APPS else None
except:
pass

View file

@ -1,3 +1,5 @@
from nine.versions import DJANGO_GTE_1_7
from settings import *
INSTALLED_APPS = list(INSTALLED_APPS)
@ -7,4 +9,10 @@ try:
except Exception as e:
pass
if DJANGO_GTE_1_7:
try:
INSTALLED_APPS.remove('south') if 'south' in INSTALLED_APPS else None
except:
pass
FOBI_DEFAULT_THEME = 'simple'

View file

@ -10,7 +10,7 @@ from django.forms.widgets import Select
from django.utils.translation import ugettext_lazy as _
from fobi.base import FormFieldPlugin, form_element_plugin_registry, get_theme
from fobi.helpers import safe_text #, admin_change_url
from fobi.helpers import safe_text
from fobi.contrib.plugins.form_elements.fields.select_model_object import UID
from fobi.contrib.plugins.form_elements.fields.select_model_object.forms \
import SelectModelObjectInputForm
@ -58,11 +58,6 @@ class SelectModelObjectInputPlugin(FormFieldPlugin):
obj = form.cleaned_data.get(self.data.name, None)
if obj:
# Handle the submitted form value
#admin_url = admin_change_url(
# app_label = obj._meta.app_label,
# module_name = obj._meta.module_name,
# object_id = obj.pk
# )
value = '{0}.{1}.{2}.{3}'.format(
obj._meta.app_label,
obj._meta.module_name,

View file

@ -4,6 +4,7 @@ __copyright__ = 'Copyright (c) 2014 Artur Barseghyan'
__license__ = 'GPL 2.0/LGPL 2.1'
__all__ = ('IGNORED_MODELS',)
from fobi.contrib.plugins.form_elements.fields.select_model_object.conf import get_setting
from fobi.contrib.plugins.form_elements.fields.select_model_object.conf \
import get_setting
IGNORED_MODELS = get_setting('IGNORED_MODELS')