-
Notifications
You must be signed in to change notification settings - Fork 3
/
forms_utils_new.py
107 lines (81 loc) · 2.87 KB
/
forms_utils_new.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# -*- coding: utf-8 -*-
import logging
import re
from bs4 import BeautifulSoup
from django import forms
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
def get_name(field):
caption = field.widget.__class__.__name__
r = ur'([A-Z]{1})([a-z]+)'
p = re.compile(r)
caption = p.sub(lambda m: '_'+m.group().lower(), caption)
return caption
@register.filter
def field_render_classes(boundfield):
"""
выводит список параметров через пробел
required - если обязательное поле
errors - если есть ошибки
valid - если валидное
meringue-<field_name> - идентификатор
"""
result = ''
if boundfield.field.required:
result += ' required'
if boundfield.errors:
result += ' errors'
if not boundfield.errors and boundfield.form.errors and boundfield.value:
result += ' valid'
result += ' meringue-'+get_name(boundfield.field)[1:]
return result
class FieldRender(object):
def __init__(self, boundfield):
self.field = boundfield
self.caption = get_name(boundfield.field)
def render(self):
result = getattr(self, self.caption+'_render', self._default_with_label_render)
return result()
# def _default_render(self):
# return self.field
def _default_with_label_render(self):
result = u'<label for=\"id_%s\" >%s</label>%s' % (
self.field.html_name,
unicode(self.field.label),
self.field
)
return mark_safe(result)
# def _customize_select_render(self):
# return self._default_with_label_render()
# def _input_with_label_render(self):
# return self._default_with_label_render()
# def _checkbox_select_multiple_render(self):
# return self._default_with_label_render()
# def _custom_range_slider_render(self):
# return self._default_with_label_render()
# def _checkbox_input_render(self):
# result = u'%s<label for=\"id_%s\" >%s</label>' % (
# self.field,
# self.field.html_name,
# unicode(self.field.label),
# )
# return mark_safe(result)
@register.filter
def field_render(boundfield):
"""
Рендерит поле в соответствии с правилами
"""
result = FieldRender(boundfield)
return result.render()
register = template.Library()
@register.filter
def add_placeholder(field):
"""
Устанавливает placeholder равный значению label
"""
soup = BeautifulSoup(unicode(field), 'html.parser')
for tag in soup.children:
if tag.name != 'script':
tag['placeholder'] = field.label
return mark_safe(soup.renderContents())