Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
D
django
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
django
Commits
8550161e
Kaydet (Commit)
8550161e
authored
Eyl 09, 2015
tarafından
Moritz Sichert
Kaydeden (comit)
Tim Graham
Eyl 16, 2015
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Refs #25294 -- Moved BoundField to django.forms.boundfield.
üst
0603f093
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
245 additions
and
227 deletions
+245
-227
utils.py
django/contrib/admin/utils.py
+1
-1
__init__.py
django/forms/__init__.py
+1
-0
boundfield.py
django/forms/boundfield.py
+227
-0
fields.py
django/forms/fields.py
+1
-1
forms.py
django/forms/forms.py
+5
-225
utils.py
django/forms/utils.py
+7
-0
test_fields.py
tests/forms_tests/tests/test_fields.py
+3
-0
No files found.
django/contrib/admin/utils.py
Dosyayı görüntüle @
8550161e
...
@@ -11,7 +11,7 @@ from django.db import models
...
@@ -11,7 +11,7 @@ from django.db import models
from
django.db.models.constants
import
LOOKUP_SEP
from
django.db.models.constants
import
LOOKUP_SEP
from
django.db.models.deletion
import
Collector
from
django.db.models.deletion
import
Collector
from
django.db.models.sql.constants
import
QUERY_TERMS
from
django.db.models.sql.constants
import
QUERY_TERMS
from
django.forms.
form
s
import
pretty_name
from
django.forms.
util
s
import
pretty_name
from
django.utils
import
formats
,
six
,
timezone
from
django.utils
import
formats
,
six
,
timezone
from
django.utils.encoding
import
force_str
,
force_text
,
smart_text
from
django.utils.encoding
import
force_str
,
force_text
,
smart_text
from
django.utils.html
import
format_html
from
django.utils.html
import
format_html
...
...
django/forms/__init__.py
Dosyayı görüntüle @
8550161e
...
@@ -3,6 +3,7 @@ Django validation and HTML form handling.
...
@@ -3,6 +3,7 @@ Django validation and HTML form handling.
"""
"""
from
django.core.exceptions
import
ValidationError
# NOQA
from
django.core.exceptions
import
ValidationError
# NOQA
from
django.forms.boundfield
import
*
# NOQA
from
django.forms.fields
import
*
# NOQA
from
django.forms.fields
import
*
# NOQA
from
django.forms.forms
import
*
# NOQA
from
django.forms.forms
import
*
# NOQA
from
django.forms.formsets
import
*
# NOQA
from
django.forms.formsets
import
*
# NOQA
...
...
django/forms/boundfield.py
0 → 100644
Dosyayı görüntüle @
8550161e
from
__future__
import
unicode_literals
import
datetime
from
django.forms.utils
import
flatatt
,
pretty_name
from
django.forms.widgets
import
Textarea
,
TextInput
from
django.utils
import
six
from
django.utils.encoding
import
(
force_text
,
python_2_unicode_compatible
,
smart_text
,
)
from
django.utils.html
import
conditional_escape
,
format_html
,
html_safe
from
django.utils.safestring
import
mark_safe
from
django.utils.translation
import
ugettext_lazy
as
_
__all__
=
(
'BoundField'
,)
UNSET
=
object
()
@html_safe
@python_2_unicode_compatible
class
BoundField
(
object
):
"A Field plus data"
def
__init__
(
self
,
form
,
field
,
name
):
self
.
form
=
form
self
.
field
=
field
self
.
name
=
name
self
.
html_name
=
form
.
add_prefix
(
name
)
self
.
html_initial_name
=
form
.
add_initial_prefix
(
name
)
self
.
html_initial_id
=
form
.
add_initial_prefix
(
self
.
auto_id
)
if
self
.
field
.
label
is
None
:
self
.
label
=
pretty_name
(
name
)
else
:
self
.
label
=
self
.
field
.
label
self
.
help_text
=
field
.
help_text
or
''
self
.
_initial_value
=
UNSET
def
__str__
(
self
):
"""Renders this field as an HTML widget."""
if
self
.
field
.
show_hidden_initial
:
return
self
.
as_widget
()
+
self
.
as_hidden
(
only_initial
=
True
)
return
self
.
as_widget
()
def
__iter__
(
self
):
"""
Yields rendered strings that comprise all widgets in this BoundField.
This really is only useful for RadioSelect widgets, so that you can
iterate over individual radio buttons in a template.
"""
id_
=
self
.
field
.
widget
.
attrs
.
get
(
'id'
)
or
self
.
auto_id
attrs
=
{
'id'
:
id_
}
if
id_
else
{}
for
subwidget
in
self
.
field
.
widget
.
subwidgets
(
self
.
html_name
,
self
.
value
(),
attrs
):
yield
subwidget
def
__len__
(
self
):
return
len
(
list
(
self
.
__iter__
()))
def
__getitem__
(
self
,
idx
):
# Prevent unnecessary reevaluation when accessing BoundField's attrs
# from templates.
if
not
isinstance
(
idx
,
six
.
integer_types
):
raise
TypeError
return
list
(
self
.
__iter__
())[
idx
]
@property
def
errors
(
self
):
"""
Returns an ErrorList for this field. Returns an empty ErrorList
if there are none.
"""
return
self
.
form
.
errors
.
get
(
self
.
name
,
self
.
form
.
error_class
())
def
as_widget
(
self
,
widget
=
None
,
attrs
=
None
,
only_initial
=
False
):
"""
Renders the field by rendering the passed widget, adding any HTML
attributes passed as attrs. If no widget is specified, then the
field's default widget will be used.
"""
if
not
widget
:
widget
=
self
.
field
.
widget
if
self
.
field
.
localize
:
widget
.
is_localized
=
True
attrs
=
attrs
or
{}
if
self
.
field
.
disabled
:
attrs
[
'disabled'
]
=
True
auto_id
=
self
.
auto_id
if
auto_id
and
'id'
not
in
attrs
and
'id'
not
in
widget
.
attrs
:
if
not
only_initial
:
attrs
[
'id'
]
=
auto_id
else
:
attrs
[
'id'
]
=
self
.
html_initial_id
if
not
only_initial
:
name
=
self
.
html_name
else
:
name
=
self
.
html_initial_name
return
force_text
(
widget
.
render
(
name
,
self
.
value
(),
attrs
=
attrs
))
def
as_text
(
self
,
attrs
=
None
,
**
kwargs
):
"""
Returns a string of HTML for representing this as an <input type="text">.
"""
return
self
.
as_widget
(
TextInput
(),
attrs
,
**
kwargs
)
def
as_textarea
(
self
,
attrs
=
None
,
**
kwargs
):
"Returns a string of HTML for representing this as a <textarea>."
return
self
.
as_widget
(
Textarea
(),
attrs
,
**
kwargs
)
def
as_hidden
(
self
,
attrs
=
None
,
**
kwargs
):
"""
Returns a string of HTML for representing this as an <input type="hidden">.
"""
return
self
.
as_widget
(
self
.
field
.
hidden_widget
(),
attrs
,
**
kwargs
)
@property
def
data
(
self
):
"""
Returns the data for this BoundField, or None if it wasn't given.
"""
return
self
.
field
.
widget
.
value_from_datadict
(
self
.
form
.
data
,
self
.
form
.
files
,
self
.
html_name
)
def
value
(
self
):
"""
Returns the value for this BoundField, using the initial value if
the form is not bound or the data otherwise.
"""
if
not
self
.
form
.
is_bound
:
data
=
self
.
form
.
initial
.
get
(
self
.
name
,
self
.
field
.
initial
)
if
callable
(
data
):
if
self
.
_initial_value
is
not
UNSET
:
data
=
self
.
_initial_value
else
:
data
=
data
()
# If this is an auto-generated default date, nix the
# microseconds for standardized handling. See #22502.
if
(
isinstance
(
data
,
(
datetime
.
datetime
,
datetime
.
time
))
and
not
self
.
field
.
widget
.
supports_microseconds
):
data
=
data
.
replace
(
microsecond
=
0
)
self
.
_initial_value
=
data
else
:
data
=
self
.
field
.
bound_data
(
self
.
data
,
self
.
form
.
initial
.
get
(
self
.
name
,
self
.
field
.
initial
)
)
return
self
.
field
.
prepare_value
(
data
)
def
label_tag
(
self
,
contents
=
None
,
attrs
=
None
,
label_suffix
=
None
):
"""
Wraps the given contents in a <label>, if the field has an ID attribute.
contents should be 'mark_safe'd to avoid HTML escaping. If contents
aren't given, uses the field's HTML-escaped label.
If attrs are given, they're used as HTML attributes on the <label> tag.
label_suffix allows overriding the form's label_suffix.
"""
contents
=
contents
or
self
.
label
if
label_suffix
is
None
:
label_suffix
=
(
self
.
field
.
label_suffix
if
self
.
field
.
label_suffix
is
not
None
else
self
.
form
.
label_suffix
)
# Only add the suffix if the label does not end in punctuation.
# Translators: If found as last label character, these punctuation
# characters will prevent the default label_suffix to be appended to the label
if
label_suffix
and
contents
and
contents
[
-
1
]
not
in
_
(
':?.!'
):
contents
=
format_html
(
'{}{}'
,
contents
,
label_suffix
)
widget
=
self
.
field
.
widget
id_
=
widget
.
attrs
.
get
(
'id'
)
or
self
.
auto_id
if
id_
:
id_for_label
=
widget
.
id_for_label
(
id_
)
if
id_for_label
:
attrs
=
dict
(
attrs
or
{},
**
{
'for'
:
id_for_label
})
if
self
.
field
.
required
and
hasattr
(
self
.
form
,
'required_css_class'
):
attrs
=
attrs
or
{}
if
'class'
in
attrs
:
attrs
[
'class'
]
+=
' '
+
self
.
form
.
required_css_class
else
:
attrs
[
'class'
]
=
self
.
form
.
required_css_class
attrs
=
flatatt
(
attrs
)
if
attrs
else
''
contents
=
format_html
(
'<label{}>{}</label>'
,
attrs
,
contents
)
else
:
contents
=
conditional_escape
(
contents
)
return
mark_safe
(
contents
)
def
css_classes
(
self
,
extra_classes
=
None
):
"""
Returns a string of space-separated CSS classes for this field.
"""
if
hasattr
(
extra_classes
,
'split'
):
extra_classes
=
extra_classes
.
split
()
extra_classes
=
set
(
extra_classes
or
[])
if
self
.
errors
and
hasattr
(
self
.
form
,
'error_css_class'
):
extra_classes
.
add
(
self
.
form
.
error_css_class
)
if
self
.
field
.
required
and
hasattr
(
self
.
form
,
'required_css_class'
):
extra_classes
.
add
(
self
.
form
.
required_css_class
)
return
' '
.
join
(
extra_classes
)
@property
def
is_hidden
(
self
):
"Returns True if this BoundField's widget is hidden."
return
self
.
field
.
widget
.
is_hidden
@property
def
auto_id
(
self
):
"""
Calculates and returns the ID attribute for this BoundField, if the
associated Form has specified auto_id. Returns an empty string otherwise.
"""
auto_id
=
self
.
form
.
auto_id
if
auto_id
and
'
%
s'
in
smart_text
(
auto_id
):
return
smart_text
(
auto_id
)
%
self
.
html_name
elif
auto_id
:
return
self
.
html_name
return
''
@property
def
id_for_label
(
self
):
"""
Wrapper around the field widget's `id_for_label` method.
Useful, for example, for focusing on this field regardless of whether
it has a single widget or a MultiWidget.
"""
widget
=
self
.
field
.
widget
id_
=
widget
.
attrs
.
get
(
'id'
)
or
self
.
auto_id
return
widget
.
id_for_label
(
id_
)
django/forms/fields.py
Dosyayı görüntüle @
8550161e
...
@@ -18,6 +18,7 @@ from django.core import validators
...
@@ -18,6 +18,7 @@ from django.core import validators
from
django.core.exceptions
import
ValidationError
from
django.core.exceptions
import
ValidationError
# Provide this import for backwards compatibility.
# Provide this import for backwards compatibility.
from
django.core.validators
import
EMPTY_VALUES
# NOQA
from
django.core.validators
import
EMPTY_VALUES
# NOQA
from
django.forms.boundfield
import
BoundField
from
django.forms.utils
import
from_current_timezone
,
to_current_timezone
from
django.forms.utils
import
from_current_timezone
,
to_current_timezone
from
django.forms.widgets
import
(
from
django.forms.widgets
import
(
FILE_INPUT_CONTRADICTION
,
CheckboxInput
,
ClearableFileInput
,
DateInput
,
FILE_INPUT_CONTRADICTION
,
CheckboxInput
,
ClearableFileInput
,
DateInput
,
...
@@ -209,7 +210,6 @@ class Field(six.with_metaclass(RenameFieldMethods, object)):
...
@@ -209,7 +210,6 @@ class Field(six.with_metaclass(RenameFieldMethods, object)):
Return a BoundField instance that will be used when accessing the form
Return a BoundField instance that will be used when accessing the form
field in a template.
field in a template.
"""
"""
from
django.forms.forms
import
BoundField
return
BoundField
(
form
,
self
,
field_name
)
return
BoundField
(
form
,
self
,
field_name
)
def
__deepcopy__
(
self
,
memo
):
def
__deepcopy__
(
self
,
memo
):
...
...
django/forms/forms.py
Dosyayı görüntüle @
8550161e
...
@@ -5,34 +5,23 @@ Form classes
...
@@ -5,34 +5,23 @@ Form classes
from
__future__
import
unicode_literals
from
__future__
import
unicode_literals
import
copy
import
copy
import
datetime
from
collections
import
OrderedDict
from
collections
import
OrderedDict
from
django.core.exceptions
import
NON_FIELD_ERRORS
,
ValidationError
from
django.core.exceptions
import
NON_FIELD_ERRORS
,
ValidationError
from
django.forms.fields
import
Field
,
FileField
from
django.forms.fields
import
Field
,
FileField
from
django.forms.utils
import
ErrorDict
,
ErrorList
,
flatatt
# pretty_name is imported for backwards compatibility in Django 1.9
from
django.forms.widgets
import
Media
,
MediaDefiningClass
,
Textarea
,
TextInput
from
django.forms.utils
import
ErrorDict
,
ErrorList
,
pretty_name
# NOQA
from
django.forms.widgets
import
Media
,
MediaDefiningClass
from
django.utils
import
six
from
django.utils
import
six
from
django.utils.encoding
import
(
from
django.utils.encoding
import
force_text
,
python_2_unicode_compatible
force_text
,
python_2_unicode_compatible
,
smart_text
,
)
from
django.utils.functional
import
cached_property
from
django.utils.functional
import
cached_property
from
django.utils.html
import
conditional_escape
,
format_html
,
html_safe
from
django.utils.html
import
conditional_escape
,
html_safe
from
django.utils.safestring
import
mark_safe
from
django.utils.safestring
import
mark_safe
from
django.utils.translation
import
ugettext
as
_
from
django.utils.translation
import
ugettext
as
_
__all__
=
(
'BaseForm'
,
'Form'
)
__all__
=
(
'BaseForm'
,
'Form'
)
def
pretty_name
(
name
):
"""Converts 'first_name' to 'First name'"""
if
not
name
:
return
''
return
name
.
replace
(
'_'
,
' '
)
.
capitalize
()
UNSET
=
object
()
class
DeclarativeFieldsMetaclass
(
MediaDefiningClass
):
class
DeclarativeFieldsMetaclass
(
MediaDefiningClass
):
"""
"""
Metaclass that collects Fields declared on the base classes.
Metaclass that collects Fields declared on the base classes.
...
@@ -491,212 +480,3 @@ class Form(six.with_metaclass(DeclarativeFieldsMetaclass, BaseForm)):
...
@@ -491,212 +480,3 @@ class Form(six.with_metaclass(DeclarativeFieldsMetaclass, BaseForm)):
# fancy metaclass stuff purely for the semantic sugar -- it allows one
# fancy metaclass stuff purely for the semantic sugar -- it allows one
# to define a form using declarative syntax.
# to define a form using declarative syntax.
# BaseForm itself has no way of designating self.fields.
# BaseForm itself has no way of designating self.fields.
@html_safe
@python_2_unicode_compatible
class
BoundField
(
object
):
"A Field plus data"
def
__init__
(
self
,
form
,
field
,
name
):
self
.
form
=
form
self
.
field
=
field
self
.
name
=
name
self
.
html_name
=
form
.
add_prefix
(
name
)
self
.
html_initial_name
=
form
.
add_initial_prefix
(
name
)
self
.
html_initial_id
=
form
.
add_initial_prefix
(
self
.
auto_id
)
if
self
.
field
.
label
is
None
:
self
.
label
=
pretty_name
(
name
)
else
:
self
.
label
=
self
.
field
.
label
self
.
help_text
=
field
.
help_text
or
''
self
.
_initial_value
=
UNSET
def
__str__
(
self
):
"""Renders this field as an HTML widget."""
if
self
.
field
.
show_hidden_initial
:
return
self
.
as_widget
()
+
self
.
as_hidden
(
only_initial
=
True
)
return
self
.
as_widget
()
def
__iter__
(
self
):
"""
Yields rendered strings that comprise all widgets in this BoundField.
This really is only useful for RadioSelect widgets, so that you can
iterate over individual radio buttons in a template.
"""
id_
=
self
.
field
.
widget
.
attrs
.
get
(
'id'
)
or
self
.
auto_id
attrs
=
{
'id'
:
id_
}
if
id_
else
{}
for
subwidget
in
self
.
field
.
widget
.
subwidgets
(
self
.
html_name
,
self
.
value
(),
attrs
):
yield
subwidget
def
__len__
(
self
):
return
len
(
list
(
self
.
__iter__
()))
def
__getitem__
(
self
,
idx
):
# Prevent unnecessary reevaluation when accessing BoundField's attrs
# from templates.
if
not
isinstance
(
idx
,
six
.
integer_types
):
raise
TypeError
return
list
(
self
.
__iter__
())[
idx
]
@property
def
errors
(
self
):
"""
Returns an ErrorList for this field. Returns an empty ErrorList
if there are none.
"""
return
self
.
form
.
errors
.
get
(
self
.
name
,
self
.
form
.
error_class
())
def
as_widget
(
self
,
widget
=
None
,
attrs
=
None
,
only_initial
=
False
):
"""
Renders the field by rendering the passed widget, adding any HTML
attributes passed as attrs. If no widget is specified, then the
field's default widget will be used.
"""
if
not
widget
:
widget
=
self
.
field
.
widget
if
self
.
field
.
localize
:
widget
.
is_localized
=
True
attrs
=
attrs
or
{}
if
self
.
field
.
disabled
:
attrs
[
'disabled'
]
=
True
auto_id
=
self
.
auto_id
if
auto_id
and
'id'
not
in
attrs
and
'id'
not
in
widget
.
attrs
:
if
not
only_initial
:
attrs
[
'id'
]
=
auto_id
else
:
attrs
[
'id'
]
=
self
.
html_initial_id
if
not
only_initial
:
name
=
self
.
html_name
else
:
name
=
self
.
html_initial_name
return
force_text
(
widget
.
render
(
name
,
self
.
value
(),
attrs
=
attrs
))
def
as_text
(
self
,
attrs
=
None
,
**
kwargs
):
"""
Returns a string of HTML for representing this as an <input type="text">.
"""
return
self
.
as_widget
(
TextInput
(),
attrs
,
**
kwargs
)
def
as_textarea
(
self
,
attrs
=
None
,
**
kwargs
):
"Returns a string of HTML for representing this as a <textarea>."
return
self
.
as_widget
(
Textarea
(),
attrs
,
**
kwargs
)
def
as_hidden
(
self
,
attrs
=
None
,
**
kwargs
):
"""
Returns a string of HTML for representing this as an <input type="hidden">.
"""
return
self
.
as_widget
(
self
.
field
.
hidden_widget
(),
attrs
,
**
kwargs
)
@property
def
data
(
self
):
"""
Returns the data for this BoundField, or None if it wasn't given.
"""
return
self
.
field
.
widget
.
value_from_datadict
(
self
.
form
.
data
,
self
.
form
.
files
,
self
.
html_name
)
def
value
(
self
):
"""
Returns the value for this BoundField, using the initial value if
the form is not bound or the data otherwise.
"""
if
not
self
.
form
.
is_bound
:
data
=
self
.
form
.
initial
.
get
(
self
.
name
,
self
.
field
.
initial
)
if
callable
(
data
):
if
self
.
_initial_value
is
not
UNSET
:
data
=
self
.
_initial_value
else
:
data
=
data
()
# If this is an auto-generated default date, nix the
# microseconds for standardized handling. See #22502.
if
(
isinstance
(
data
,
(
datetime
.
datetime
,
datetime
.
time
))
and
not
self
.
field
.
widget
.
supports_microseconds
):
data
=
data
.
replace
(
microsecond
=
0
)
self
.
_initial_value
=
data
else
:
data
=
self
.
field
.
bound_data
(
self
.
data
,
self
.
form
.
initial
.
get
(
self
.
name
,
self
.
field
.
initial
)
)
return
self
.
field
.
prepare_value
(
data
)
def
label_tag
(
self
,
contents
=
None
,
attrs
=
None
,
label_suffix
=
None
):
"""
Wraps the given contents in a <label>, if the field has an ID attribute.
contents should be 'mark_safe'd to avoid HTML escaping. If contents
aren't given, uses the field's HTML-escaped label.
If attrs are given, they're used as HTML attributes on the <label> tag.
label_suffix allows overriding the form's label_suffix.
"""
contents
=
contents
or
self
.
label
if
label_suffix
is
None
:
label_suffix
=
(
self
.
field
.
label_suffix
if
self
.
field
.
label_suffix
is
not
None
else
self
.
form
.
label_suffix
)
# Only add the suffix if the label does not end in punctuation.
# Translators: If found as last label character, these punctuation
# characters will prevent the default label_suffix to be appended to the label
if
label_suffix
and
contents
and
contents
[
-
1
]
not
in
_
(
':?.!'
):
contents
=
format_html
(
'{}{}'
,
contents
,
label_suffix
)
widget
=
self
.
field
.
widget
id_
=
widget
.
attrs
.
get
(
'id'
)
or
self
.
auto_id
if
id_
:
id_for_label
=
widget
.
id_for_label
(
id_
)
if
id_for_label
:
attrs
=
dict
(
attrs
or
{},
**
{
'for'
:
id_for_label
})
if
self
.
field
.
required
and
hasattr
(
self
.
form
,
'required_css_class'
):
attrs
=
attrs
or
{}
if
'class'
in
attrs
:
attrs
[
'class'
]
+=
' '
+
self
.
form
.
required_css_class
else
:
attrs
[
'class'
]
=
self
.
form
.
required_css_class
attrs
=
flatatt
(
attrs
)
if
attrs
else
''
contents
=
format_html
(
'<label{}>{}</label>'
,
attrs
,
contents
)
else
:
contents
=
conditional_escape
(
contents
)
return
mark_safe
(
contents
)
def
css_classes
(
self
,
extra_classes
=
None
):
"""
Returns a string of space-separated CSS classes for this field.
"""
if
hasattr
(
extra_classes
,
'split'
):
extra_classes
=
extra_classes
.
split
()
extra_classes
=
set
(
extra_classes
or
[])
if
self
.
errors
and
hasattr
(
self
.
form
,
'error_css_class'
):
extra_classes
.
add
(
self
.
form
.
error_css_class
)
if
self
.
field
.
required
and
hasattr
(
self
.
form
,
'required_css_class'
):
extra_classes
.
add
(
self
.
form
.
required_css_class
)
return
' '
.
join
(
extra_classes
)
@property
def
is_hidden
(
self
):
"Returns True if this BoundField's widget is hidden."
return
self
.
field
.
widget
.
is_hidden
@property
def
auto_id
(
self
):
"""
Calculates and returns the ID attribute for this BoundField, if the
associated Form has specified auto_id. Returns an empty string otherwise.
"""
auto_id
=
self
.
form
.
auto_id
if
auto_id
and
'
%
s'
in
smart_text
(
auto_id
):
return
smart_text
(
auto_id
)
%
self
.
html_name
elif
auto_id
:
return
self
.
html_name
return
''
@property
def
id_for_label
(
self
):
"""
Wrapper around the field widget's `id_for_label` method.
Useful, for example, for focusing on this field regardless of whether
it has a single widget or a MultiWidget.
"""
widget
=
self
.
field
.
widget
id_
=
widget
.
attrs
.
get
(
'id'
)
or
self
.
auto_id
return
widget
.
id_for_label
(
id_
)
django/forms/utils.py
Dosyayı görüntüle @
8550161e
...
@@ -16,6 +16,13 @@ except ImportError: # Python 2
...
@@ -16,6 +16,13 @@ except ImportError: # Python 2
from
UserList
import
UserList
from
UserList
import
UserList
def
pretty_name
(
name
):
"""Converts 'first_name' to 'First name'"""
if
not
name
:
return
''
return
name
.
replace
(
'_'
,
' '
)
.
capitalize
()
def
flatatt
(
attrs
):
def
flatatt
(
attrs
):
"""
"""
Convert a dictionary of attributes to a single string.
Convert a dictionary of attributes to a single string.
...
...
tests/forms_tests/tests/test_fields.py
Dosyayı görüntüle @
8550161e
...
@@ -1515,6 +1515,7 @@ class FieldsTests(SimpleTestCase):
...
@@ -1515,6 +1515,7 @@ class FieldsTests(SimpleTestCase):
f
.
choices
.
sort
()
f
.
choices
.
sort
()
expected
=
[
expected
=
[
(
'/django/forms/__init__.py'
,
'__init__.py'
),
(
'/django/forms/__init__.py'
,
'__init__.py'
),
(
'/django/forms/boundfield.py'
,
'boundfield.py'
),
(
'/django/forms/fields.py'
,
'fields.py'
),
(
'/django/forms/fields.py'
,
'fields.py'
),
(
'/django/forms/forms.py'
,
'forms.py'
),
(
'/django/forms/forms.py'
,
'forms.py'
),
(
'/django/forms/formsets.py'
,
'formsets.py'
),
(
'/django/forms/formsets.py'
,
'formsets.py'
),
...
@@ -1538,6 +1539,7 @@ class FieldsTests(SimpleTestCase):
...
@@ -1538,6 +1539,7 @@ class FieldsTests(SimpleTestCase):
f
.
choices
.
sort
()
f
.
choices
.
sort
()
expected
=
[
expected
=
[
(
'/django/forms/__init__.py'
,
'__init__.py'
),
(
'/django/forms/__init__.py'
,
'__init__.py'
),
(
'/django/forms/boundfield.py'
,
'boundfield.py'
),
(
'/django/forms/fields.py'
,
'fields.py'
),
(
'/django/forms/fields.py'
,
'fields.py'
),
(
'/django/forms/forms.py'
,
'forms.py'
),
(
'/django/forms/forms.py'
,
'forms.py'
),
(
'/django/forms/formsets.py'
,
'formsets.py'
),
(
'/django/forms/formsets.py'
,
'formsets.py'
),
...
@@ -1556,6 +1558,7 @@ class FieldsTests(SimpleTestCase):
...
@@ -1556,6 +1558,7 @@ class FieldsTests(SimpleTestCase):
f
.
choices
.
sort
()
f
.
choices
.
sort
()
expected
=
[
expected
=
[
(
'/django/forms/__init__.py'
,
'__init__.py'
),
(
'/django/forms/__init__.py'
,
'__init__.py'
),
(
'/django/forms/boundfield.py'
,
'boundfield.py'
),
(
'/django/forms/extras/__init__.py'
,
'extras/__init__.py'
),
(
'/django/forms/extras/__init__.py'
,
'extras/__init__.py'
),
(
'/django/forms/extras/widgets.py'
,
'extras/widgets.py'
),
(
'/django/forms/extras/widgets.py'
,
'extras/widgets.py'
),
(
'/django/forms/fields.py'
,
'fields.py'
),
(
'/django/forms/fields.py'
,
'fields.py'
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment