3
vÅÏ^Œ   ã               @   s   d dl m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mZmZ G dd„ deƒZG dd	„ d	eeƒZG d
d„ de
ƒZG dd„ deeƒZG dd„ de	eƒZG dd„ deeƒZG dd„ deeƒZG dd„ deeƒZG dd„ deeƒZG dd„ dƒZG dd„ deeƒZG dd„ deeƒZdS )é    )ÚImproperlyConfigured)Úmodels)ÚHttpResponseRedirect)ÚContextMixinÚTemplateResponseMixinÚView)ÚBaseDetailViewÚSingleObjectMixinÚ!SingleObjectTemplateResponseMixinc                   sr   e Zd ZdZi ZdZdZdZdd„ Zdd„ Z	dd„ Z
dd	d
„Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Z‡  ZS )Ú	FormMixinz5Provide a way to show and handle a form in a request.Nc             C   s
   | j jƒ S )z6Return the initial data to use for forms on this view.)ÚinitialÚcopy)Úself© r   ú=/usr/lib/python3.6/site-packages/django/views/generic/edit.pyÚget_initial   s    zFormMixin.get_initialc             C   s   | j S )z#Return the prefix to use for forms.)Úprefix)r   r   r   r   Ú
get_prefix   s    zFormMixin.get_prefixc             C   s   | j S )zReturn the form class to use.)Ú
form_class)r   r   r   r   Úget_form_class   s    zFormMixin.get_form_classc             C   s   |dkr| j ƒ }|f | jƒ ŽS )z7Return an instance of the form to be used in this view.N)r   Úget_form_kwargs)r   r   r   r   r   Úget_form   s    zFormMixin.get_formc             C   s:   | j ƒ | jƒ dœ}| jjdkr6|j| jj| jjdœƒ |S )z8Return the keyword arguments for instantiating the form.)r   r   ÚPOSTÚPUT)ÚdataÚfiles)r   r   )r   r   ÚrequestÚmethodÚupdater   ÚFILES)r   Úkwargsr   r   r   r   #   s    zFormMixin.get_form_kwargsc             C   s   | j stdƒ‚t| j ƒS )z<Return the URL to redirect to after processing a valid form.z-No URL to redirect to. Provide a success_url.)Úsuccess_urlr   Ústr)r   r   r   r   Úget_success_url1   s    zFormMixin.get_success_urlc             C   s   t | jƒ ƒS )z3If the form is valid, redirect to the supplied URL.)r   r#   )r   Úformr   r   r   Ú
form_valid7   s    zFormMixin.form_validc             C   s   | j | j|dƒS )z0If the form is invalid, render the invalid form.)r$   )Úrender_to_responseÚget_context_data)r   r$   r   r   r   Úform_invalid;   s    zFormMixin.form_invalidc                s"   d|kr| j ƒ |d< tƒ jf |ŽS )z&Insert the form into the context dict.r$   )r   Úsuperr'   )r   r    )Ú	__class__r   r   r'   ?   s    zFormMixin.get_context_data)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r   r   r   r   r   r   r#   r%   r(   r'   Ú__classcell__r   r   )r*   r   r   
   s   
r   c                   s@   e Zd ZdZdZdd„ Z‡ fdd„Zdd„ Z‡ fd	d
„Z‡  Z	S )ÚModelFormMixinz:Provide a way to show and handle a ModelForm in a request.Nc             C   sˆ   | j dk	r| jrtdƒ‚| jr$| jS | jdk	r6| j}n$t| ddƒdk	rP| jj}n
| jƒ j}| j dkrttd| jj ƒ‚t	j
|| j dS dS )z*Return the form class to use in this view.Nz;Specifying both 'fields' and 'form_class' is not permitted.ÚobjectzUUsing ModelFormMixin (base class of %s) without the 'fields' attribute is prohibited.)Úfields)r2   r   r   ÚmodelÚgetattrr1   r*   Úget_querysetr+   Úmodel_formsÚmodelform_factory)r   r3   r   r   r   r   J   s    



zModelFormMixin.get_form_classc                s(   t ƒ jƒ }t| dƒr$|jd| jiƒ |S )z8Return the keyword arguments for instantiating the form.r1   Úinstance)r)   r   Úhasattrr   r1   )r   r    )r*   r   r   r   g   s    

zModelFormMixin.get_form_kwargsc             C   sJ   | j r| j jf | jjŽ}n,y| jjƒ }W n tk
rD   tdƒ‚Y nX |S )z<Return the URL to redirect to after processing a valid form.z^No URL to redirect to.  Either provide a url or define a get_absolute_url method on the Model.)r!   Úformatr1   Ú__dict__Úget_absolute_urlÚAttributeErrorr   )r   Úurlr   r   r   r#   n   s    zModelFormMixin.get_success_urlc                s   |j ƒ | _tƒ j|ƒS )z0If the form is valid, save the associated model.)Úsaver1   r)   r%   )r   r$   )r*   r   r   r%   {   s    
zModelFormMixin.form_valid)
r+   r,   r-   r.   r2   r   r   r#   r%   r/   r   r   )r*   r   r0   F   s   r0   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚProcessFormViewz.Render a form on GET and processes it on POST.c             O   s   | j | jƒ ƒS )z=Handle GET requests: instantiate a blank version of the form.)r&   r'   )r   r   Úargsr    r   r   r   Úgetƒ   s    zProcessFormView.getc             O   s(   | j ƒ }|jƒ r| j|ƒS | j|ƒS dS )zˆ
        Handle POST requests: instantiate a form instance with the passed
        POST variables and then check if it's valid.
        N)r   Úis_validr%   r(   )r   r   rA   r    r$   r   r   r   Úpost‡   s    
zProcessFormView.postc             O   s   | j ||ŽS )N)rD   )r   rA   r    r   r   r   Úput”   s    zProcessFormView.putN)r+   r,   r-   r.   rB   rD   rE   r   r   r   r   r@      s   r@   c               @   s   e Zd ZdZdS )ÚBaseFormViewz"A base view for displaying a form.N)r+   r,   r-   r.   r   r   r   r   rF   ˜   s   rF   c               @   s   e Zd ZdZdS )ÚFormViewz?A view for displaying a form and rendering a template response.N)r+   r,   r-   r.   r   r   r   r   rG   œ   s   rG   c                   s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚBaseCreateViewz„
    Base view for creating a new object instance.

    Using this base class requires subclassing to provide a response mixin.
    c                s   d | _ tƒ j|f|ž|ŽS )N)r1   r)   rB   )r   r   rA   r    )r*   r   r   rB   ¦   s    zBaseCreateView.getc                s   d | _ tƒ j|f|ž|ŽS )N)r1   r)   rD   )r   r   rA   r    )r*   r   r   rD   ª   s    zBaseCreateView.post)r+   r,   r-   r.   rB   rD   r/   r   r   )r*   r   rH       s   rH   c               @   s   e Zd ZdZdZdS )Ú
CreateViewzQ
    View for creating a new object, with a response rendered by a template.
    Ú_formN)r+   r,   r-   r.   Útemplate_name_suffixr   r   r   r   rI   ¯   s   rI   c                   s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚBaseUpdateViewz
    Base view for updating an existing object.

    Using this base class requires subclassing to provide a response mixin.
    c                s   | j ƒ | _tƒ j|f|ž|ŽS )N)Ú
get_objectr1   r)   rB   )r   r   rA   r    )r*   r   r   rB   ¼   s    
zBaseUpdateView.getc                s   | j ƒ | _tƒ j|f|ž|ŽS )N)rM   r1   r)   rD   )r   r   rA   r    )r*   r   r   rD   À   s    
zBaseUpdateView.post)r+   r,   r-   r.   rB   rD   r/   r   r   )r*   r   rL   ¶   s   rL   c               @   s   e Zd ZdZdZdS )Ú
UpdateViewzDView for updating an object, with a response rendered by a template.rJ   N)r+   r,   r-   r.   rK   r   r   r   r   rN   Å   s   rN   c               @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ ZdS )	ÚDeletionMixinz&Provide the ability to delete objects.Nc             O   s$   | j ƒ | _| jƒ }| jjƒ  t|ƒS )zn
        Call the delete() method on the fetched object and then redirect to the
        success URL.
        )rM   r1   r#   Údeleter   )r   r   rA   r    r!   r   r   r   rP   Î   s    

zDeletionMixin.deletec             O   s   | j |f|ž|ŽS )N)rP   )r   r   rA   r    r   r   r   rD   Ù   s    zDeletionMixin.postc             C   s$   | j r| j jf | jjŽS tdƒ‚d S )Nz-No URL to redirect to. Provide a success_url.)r!   r:   r1   r;   r   )r   r   r   r   r#   Ü   s    zDeletionMixin.get_success_url)r+   r,   r-   r.   r!   rP   rD   r#   r   r   r   r   rO   Ê   s
   rO   c               @   s   e Zd ZdZdS )ÚBaseDeleteViewzx
    Base view for deleting an object.

    Using this base class requires subclassing to provide a response mixin.
    N)r+   r,   r-   r.   r   r   r   r   rQ   ä   s   rQ   c               @   s   e Zd ZdZdZdS )Ú
DeleteViewzs
    View for deleting an object retrieved with self.get_object(), with a
    response rendered by a template.
    Z_confirm_deleteN)r+   r,   r-   r.   rK   r   r   r   r   rR   ì   s   rR   N)Údjango.core.exceptionsr   Zdjango.formsr   r6   Údjango.httpr   Údjango.views.generic.baser   r   r   Údjango.views.generic.detailr   r	   r
   r   r0   r@   rF   rG   rH   rI   rL   rN   rO   rQ   rR   r   r   r   r   Ú<module>   s    <;