o
    ^"<f(                     @   s   d dl Z d dlZd dlmZmZ d dlmZ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 dZeG d	d
 d
ZeG dd dZdS )    N)flatattpretty_name)Textarea	TextInput)cached_property)conditional_escapeformat_html	html_safe)	mark_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d0ddZd1ddZd1ddZd1ddZedd Zdd Zd2d d!Zd1d"d#Zed$d% Zed&d' Zed(d) Zed*d+ Zd1d,d-Zed.d/ ZdS )3r   zA Field plus datac                 C   sj   || _ || _|| _||| _||| _|| j| _| jj	d u r(t
|| _	n| jj	| _	|jp1d| _d S )N )formfieldname
add_prefix	html_nameadd_initial_prefixhtml_initial_nameauto_idhtml_initial_idlabelr   	help_text)selfr   r   r    r   N/var/www/html/kck/venv/lib/python3.10/site-packages/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__5   s   zBoundField.__bool__c                 C   
   t | jS N)iterr,   r!   r   r   r   __iter__9      
zBoundField.__iter__c                 C   r0   r1   )lenr,   r!   r   r   r   __len__<   r4   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__?   s   
zBoundField.__getitem__c                 C   s   | j j| j| j  S )zT
        Return an ErrorList (empty if there are no errors) for this field.
        )r   errorsr*   r   error_classr!   r   r   r   r?   I   s   zBoundField.errorsNFc                 C   s|   |p| j j}| j jrd|_|pi }| ||}| jr+d|jvr+|d|r'| jn| j |j	|r2| 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%   localizeis_localizedr+   r   r)   
setdefaultr   renderr   r   r-   r   r&   )r   r%   r)   r   r   r   r   r   P   s   zBoundField.as_widgetc                 K      | j t |fi |S )zZ
        Return a string of HTML for representing this as an <input type="text">.
        )r   r   r   r)   kwargsr   r   r   as_textd   s   zBoundField.as_textc                 K   rE   )z>Return a string of HTML for representing this as a <textarea>.)r   r   rF   r   r   r   as_textareaj   s   zBoundField.as_textareac                 K   s   | j | j |fi |S )z\
        Return a string of HTML for representing this as an <input type="hidden">.
        )r   r   hidden_widgetrF   r   r   r   r    n   s   zBoundField.as_hiddenc                 C   s   | j j| jj| jj| jS )zR
        Return the data for this BoundField, or None if it wasn't given.
        )r   r%   value_from_datadictr   datafilesr   r!   r   r   r   rL   t   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   is_boundr   
bound_datarL   prepare_valuer   rL   r   r   r   r-   {   s   zBoundField.valuec                 C   s  |p| j }|du r| jjdur| jjn| jj}|r)|r)|d tdvr)td||}| jj}|jdp5| j	}|r|
|}|rIi |pCi d|i}| jjrnt| jdrn|pVi }d|v rh|d  d	| jj 7  < n| jj|d< |rtt|nd
}td||}t|S t|}t|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   z<label{}>{}</label>)r   r   label_suffixr   _r   r%   r)   r*   r   id_for_labelrequiredhasattrrU   r   r   r
   )r   contentsr)   rX   r%   r.   rZ   r   r   r   	label_tag   s.   


zBoundField.label_tagc                 C   sj   t |dr	| }t|pg }| jrt | jdr|| jj | jjr0t | jdr0|| jj	 d
|S )zP
        Return a string of space-separated CSS classes for this field.
        spliterror_css_classrU   rW   )r\   r_   setr?   r   addr`   r   r[   rU   join)r   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   rf      s   
zBoundField.is_hiddenc                 C   s0   | j j}|rdt|v 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   rZ   )r   r%   r.   r   r   r   rZ      s   
zBoundField.id_for_labelc                 C   s>   | j | j| j}t|tjtjfr| jjjs|j	dd}|S )Nr   )microsecond)
r   get_initial_for_fieldr   r   r7   datetimetimer%   supports_microsecondsreplacerR   r   r   r   rN      s   zBoundField.initialc                 C   sL   |p| j j}t|}|| jr| j jr| jjrd|d< | j jr$d|d< |S )NTr[   disabled)r   r%   dictuse_required_attributerN   r[   r   rn   )r   r)   r%   r   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__r<   lowerr!   r   r   r   widget_type   s   zBoundField.widget_type)NNFr1   )NNN)r<   
__module____qualname____doc__r   r"   r   r,   r/   r3   r6   r>   propertyr?   r   rH   rI   r    rL   r-   r^   re   rf   r   rZ   rN   r+   ru   r   r   r   r   r      s@    










%





		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 r1   )parent_widgetrL   r&   )r   rz   rL   r&   r   r   r   r      s   
zBoundWidget.__init__c                 C   s   | j ddS )NT)
wrap_label)tagr!   r   r   r   r"      s   zBoundWidget.__str__Fc                 C   s*   di | j d|ii}| j| j|| jS )Nr%   r{   )rL   rz   _rendertemplate_namer&   )r   r{   contextr   r   r   r|     s   zBoundWidget.tagc                 C   s   d| j v r
| j d S | jjS )Nr~   )rL   rz   r~   r!   r   r   r   r~     s   

zBoundWidget.template_namec                 C   s   d| j d | j d f S )Nzid_%s_%sr   indexrL   r!   r   r   r   rZ     s   zBoundWidget.id_for_labelc                 C   s
   | j d S )Nr   r   r!   r   r   r   choice_label  s   
zBoundWidget.choice_labelN)F)r<   rv   rw   rx   r   r"   r|   ry   r~   rZ   r   r   r   r   r   r$      s    


r$   )rj   rq   django.forms.utilsr   r   django.forms.widgetsr   r   django.utils.functionalr   django.utils.htmlr   r   r	   django.utils.safestringr
   django.utils.translationr   rY   __all__r   r$   r   r   r   r   <module>   s     ^