U
    d/                     @   s   d dl Z d dlmZ d dlmZ d dlmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZ dZeG d	d
 d
ZeG dd dZdS )    N)ValidationError)pretty_name)MultiWidgetTextarea	TextInput)cached_property)format_html	html_safe)gettext_lazy)
BoundFieldc                   @   s  e Zd ZdZdd Zdd Zedd Zdd	 Zd
d Z	dd Z
dd Zedd Zd6ddZd7ddZd8ddZd9ddZedd Zdd Zd d! Zd:d"d#Zd;d$d%Zd<d&d'Zed(d) Zed*d+ Zed,d- Zed.d/ Zd=d0d1Zed2d3 Zed4d5 ZdS )>r   zA Field plus datac                 C   sj   || _ || _|| _||| _||| _|| j| _| jj	d krPt
|| _	n
| jj	| _	|jpbd| _d S )N )formfieldnameZ
add_prefix	html_nameZadd_initial_prefixhtml_initial_nameauto_idhtml_initial_idlabelr   	help_text)selfr   r   r    r   ;/tmp/pip-unpacked-wheel-7vj2equ7/django/forms/boundfield.py__init__   s    
zBoundField.__init__c                 C   s$   | j jr|  | jdd S |  S )z$Render this field as an HTML widget.T)only_initial)r   show_hidden_initial	as_widget	as_hiddenr   r   r   r   __str__   s    zBoundField.__str__c                    sX    j jjdp j}|r"d|ini } |} fdd j jj j  |dD S )a  
        Most widgets yield a single subwidget, but others like RadioSelect and
        CheckboxSelectMultiple produce one subwidget for each choice.

        This property is cached so that only one database query occurs when
        rendering ModelChoiceFields.
        idc                    s    g | ]}t  jj| jjqS r   )BoundWidgetr   widgetr   renderer).0r"   r   r   r   
<listcomp>0   s   z)BoundField.subwidgets.<locals>.<listcomp>)attrs)	r   r"   r&   getr   build_widget_attrs
subwidgetsr   value)r   id_r&   r   r   r   r)   $   s    	

  zBoundField.subwidgetsc                 C   s   dS NTr   r   r   r   r   __bool__7   s    zBoundField.__bool__c                 C   s
   t | jS N)iterr)   r   r   r   r   __iter__;   s    zBoundField.__iter__c                 C   s
   t | jS r.   )lenr)   r   r   r   r   __len__>   s    zBoundField.__len__c                 C   s*   t |ttfs tdt|j | j| S )Nz6BoundField indices must be integers or slices, not %s.)
isinstanceintslice	TypeErrortype__name__r)   )r   idxr   r   r   __getitem__A   s    zBoundField.__getitem__c                 C   s    | j j| j| j j| j jdS )zT
        Return an ErrorList (empty if there are no errors) for this field.
        )r#   )r   errorsr'   r   Zerror_classr#   r   r   r   r   r;   K   s     zBoundField.errorsNFc                 C   s|   |p
| j j}| j jrd|_|p i }| ||}| jrVd|jkrV|d|rN| jn| j |j	|rd| j
n| j|  || jjdS )z
        Render the field by rendering the passed widget, adding any HTML
        attributes passed as attrs. If a widget isn't specified, use the
        field's default widget.
        Tr    )r   r*   r&   r#   )r   r"   ZlocalizeZis_localizedr(   r   r&   
setdefaultr   renderr   r   r*   r   r#   )r   r"   r&   r   r   r   r   r   T   s      zBoundField.as_widgetc                 K   s   | j t |f|S )zZ
        Return a string of HTML for representing this as an <input type="text">.
        )r   r   r   r&   kwargsr   r   r   as_textj   s    zBoundField.as_textc                 K   s   | j t |f|S )z>Return a string of HTML for representing this as a <textarea>.)r   r   r>   r   r   r   as_textareap   s    zBoundField.as_textareac                 K   s   | j | j |f|S )z\
        Return a string of HTML for representing this as an <input type="hidden">.
        )r   r   hidden_widgetr>   r   r   r   r   t   s    zBoundField.as_hiddenc                 C   s   | j | jj| jS )zR
        Return the data for this BoundField, or None if it wasn't given.
        )r   _widget_data_valuer   r"   r   r   r   r   r   dataz   s    zBoundField.datac                 C   s*   | j }| jjr| j| j|}| j|S )z
        Return the value for this BoundField, using the initial value if
        the form is not bound or the data otherwise.
        )initialr   Zis_boundr   Z
bound_datarD   Zprepare_value)r   rD   r   r   r   r*      s    zBoundField.valuec                 C   s`   | j }|jrL| }| j|| j}z||}W qR tk
rH   Y dS X n| j}|	|| j
S r,   )r   r   rB   r   rC   r   Z	to_pythonr   rE   Zhas_changedrD   )r   r   rB   initial_valuer   r   r   _has_changed   s    
zBoundField._has_changedc           	      C   s  |p| j }|dkr.| jjdk	r&| jjn| jj}|rR|rR|d tdkrRtd||}| jj}|jdpj| j	}|r|
|}|r|pi d|i}| jjrt| jdr|pi }d|kr|d  d	| jj 7  < n| jj|d< | ||t||pd
d}| j| jj|S )ad  
        Wrap 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, use the field's HTML-escaped label.

        If attrs are given, use them as HTML attributes on the <label> tag.

        label_suffix overrides the form's label_suffix.
        Nz:?.!z{}{}r    forrequired_css_classclass r   )r   r   r&   Zuse_tagtag)r   r   label_suffixr   _r   r"   r&   r'   r   id_for_labelrequiredhasattrrJ   boolr=   Ztemplate_name_label)	r   contentsr&   rN   rM   r"   r+   rP   contextr   r   r   	label_tag   s4    




zBoundField.label_tagc                 C   s   | j |||ddS )af  
        Wrap the given contents in a <legend>, if the field has an ID
        attribute. Contents should be mark_safe'd to avoid HTML escaping. If
        contents aren't given, use the field's HTML-escaped label.

        If attrs are given, use them as HTML attributes on the <legend> tag.

        label_suffix overrides the form's label_suffix.
        ZlegendrM   )rV   )r   rT   r&   rN   r   r   r   
legend_tag   s    
zBoundField.legend_tagc                 C   sj   t |dr| }t|pg }| jr>t | jdr>|| jj | jjr`t | jdr`|| jj	 d
|S )zP
        Return a string of space-separated CSS classes for this field.
        spliterror_css_classrJ   rL   )rR   rY   setr;   r   addrZ   r   rQ   rJ   join)r   Zextra_classesr   r   r   css_classes   s    
zBoundField.css_classesc                 C   s
   | j jjS )z2Return True if this BoundField's widget is hidden.)r   r"   	is_hiddenr   r   r   r   r_      s    zBoundField.is_hiddenc                 C   s0   | j j}|r"dt|kr"|| j S |r,| jS dS )z
        Calculate and return the ID attribute for this BoundField, if the
        associated Form has specified auto_id. Return an empty string otherwise.
        z%sr   )r   r   strr   )r   r   r   r   r   r      s    
zBoundField.auto_idc                 C   s$   | j j}|jdp| j}||S )z
        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.
        r    )r   r"   r&   r'   r   rP   )r   r"   r+   r   r   r   rP      s    zBoundField.id_for_labelc                 C   s   | j | j| jS r.   )r   Zget_initial_for_fieldr   r   r   r   r   r   rE      s    zBoundField.initialc                 C   s   |p
| j j}t|}|| jr| j jr| jjrt| j dr| j jst	| j jt
rt| j j|jD ] \}}|| joz|j|jd< qbnd|d< | j jrd|d< |S )Nrequire_all_fieldsrQ   Tdisabled)r   r"   dictZuse_required_attributerE   rQ   r   rR   ra   r3   r   zipfieldsZwidgetsr&   rb   )r   r&   r"   ZsubfieldZ	subwidgetr   r   r   r(     s,    

zBoundField.build_widget_attrsc                 C   s   t dd| jjjj S )Nzwidget$|input$r   )resubr   r"   	__class__r8   lowerr   r   r   r   widget_type  s
      zBoundField.widget_typec                 C   s
   | j jjS )zV
        Return the value of this BoundField widget's use_fieldset attribute.
        )r   r"   use_fieldsetr   r   r   r   rk   !  s    zBoundField.use_fieldset)NNF)N)N)N)NNNN)NNN)N)N)r8   
__module____qualname____doc__r   r   r   r)   r-   r0   r2   r:   propertyr;   r   r@   rA   r   rD   r*   rG   rV   rX   r^   r_   r   rP   rE   r(   rj   rk   r   r   r   r   r      sF   









+








r   c                   @   sN   e Zd ZdZdd Zdd ZdddZed	d
 Zedd Z	edd Z
dS )r!   ap  
    A container class used for iterating over widgets. This is useful for
    widgets that have choices. For example, the following can be used in a
    template:

    {% for radio in myform.beatles %}
      <label for="{{ radio.id_for_label }}">
        {{ radio.choice_label }}
        <span class="radio">{{ radio.tag }}</span>
      </label>
    {% endfor %}
    c                 C   s   || _ || _|| _d S r.   )parent_widgetrD   r#   )r   rp   rD   r#   r   r   r   r   8  s    zBoundWidget.__init__c                 C   s   | j ddS )NT)
wrap_labelrW   r   r   r   r   r   =  s    zBoundWidget.__str__Fc                 C   s&   d| j d|ii}| j| j|| jS )Nr"   rq   )rD   rp   Z_rendertemplate_namer#   )r   rq   rU   r   r   r   rM   @  s    zBoundWidget.tagc                 C   s   d| j kr| j d S | jjS )Nrr   )rD   rp   rr   r   r   r   r   rr   D  s    

zBoundWidget.template_namec                 C   s   | j d dS )Nr&   r    )rD   r'   r   r   r   r   rP   J  s    zBoundWidget.id_for_labelc                 C   s
   | j d S )Nr   )rD   r   r   r   r   choice_labelN  s    zBoundWidget.choice_labelN)F)r8   rl   rm   rn   r   r   rM   ro   rr   rP   rs   r   r   r   r   r!   )  s   


r!   )rf   Zdjango.core.exceptionsr   Zdjango.forms.utilsr   Zdjango.forms.widgetsr   r   r   Zdjango.utils.functionalr   Zdjango.utils.htmlr   r	   Zdjango.utils.translationr
   rO   __all__r   r!   r   r   r   r   <module>   s     