mirror of
https://github.com/Hopiu/django-fobi.git
synced 2026-05-17 17:11:07 +00:00
add an form element plugin override example
This commit is contained in:
parent
a83649dc17
commit
3afeaa2c6e
9 changed files with 160 additions and 8 deletions
|
|
@ -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)
|
||||
63
examples/simple/override_select_model_object_plugin/forms.py
Normal file
63
examples/simple/override_select_model_object_plugin/forms.py
Normal 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
|
||||
)
|
||||
2
examples/simple/runserver-override-select-model-object-plugin.sh
Executable file
2
examples/simple/runserver-override-select-model-object-plugin.sh
Executable 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
Loading…
Reference in a new issue