3
(hF#                 @   s.  d dl mZ 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eZG dd deeZG dd deeZdS )     )ImproperlyConfigured)models)HttpResponseRedirect)
force_text)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 )	FormMixinzM
    A mixin that provides a way to show and handle a form in a request.
    Nc             C   s
   | j j S )zI
        Returns the initial data to use for forms on this view.
        )initialcopy)self r   =/tmp/pip-install-q3hcpn_q/Django/django/views/generic/edit.pyget_initial   s    zFormMixin.get_initialc             C   s   | j S )zB
        Returns the prefix to use for forms on this view
        )prefix)r   r   r   r   
get_prefix   s    zFormMixin.get_prefixc             C   s   | j S )z<
        Returns the form class to use in this view
        )
form_class)r   r   r   r   get_form_class!   s    zFormMixin.get_form_classc             C   s   |dkr| j  }|f | j S )zJ
        Returns 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 )zK
        Returns the keyword arguments for instantiating the form.
        )r   r   POSTPUT)datafiles)r   r   )r   r   requestmethodupdater   ZFILES)r   kwargsr   r   r   r   /   s    zFormMixin.get_form_kwargsc             C   s   | j rt| j }ntd|S )z3
        Returns the supplied success URL.
        z-No URL to redirect to. Provide a success_url.)success_urlr   r   )r   urlr   r   r   get_success_url?   s
    zFormMixin.get_success_urlc             C   s   t | j S )zE
        If the form is valid, redirect to the supplied URL.
        )r   r#   )r   formr   r   r   
form_validK   s    zFormMixin.form_validc             C   s   | j | j|dS )zr
        If the form is invalid, re-render the context data with the
        data-filled form and errors.
        )r$   )render_to_responseget_context_data)r   r$   r   r   r   form_invalidQ   s    zFormMixin.form_invalidc                s&   d|kr| j  |d< tt| jf |S )z8
        Insert the form into the context dict.
        r$   )r   superr   r'   )r   r    )	__class__r   r   r'   X   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 )ModelFormMixinzR
    A mixin that provides 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rT| jdk	rT| jj}n
| j j}| j dkrxtd| jj t	j
|| j dS dS )z=
        Returns 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hasattrr1   r*   Zget_querysetr+   model_formsZmodelform_factory)r   r3   r   r   r   r   g   s    



zModelFormMixin.get_form_classc                s,   t t| j }t| dr(|jd| ji |S )zK
        Returns the keyword arguments for instantiating the form.
        r1   instance)r)   r0   r   r4   r   r1   )r   r    )r*   r   r   r      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+
        Returns the supplied URL.
        z^No URL to redirect to.  Either provide a url or define a get_absolute_url method on the Model.)r!   formatr1   __dict__Zget_absolute_urlAttributeErrorr   )r   r"   r   r   r   r#      s    zModelFormMixin.get_success_urlc                s   |j  | _tt| j|S )zB
        If the form is valid, save the associated model.
        )saver1   r)   r0   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   a   s   	r0   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ProcessFormViewzF
    A mixin that renders a form on GET and processes it on POST.
    c             O   s   | j | j S )zT
        Handles GET requests and instantiates 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
        Handles POST requests, instantiating a form instance with the passed
        POST variables and then checked for validity.
        N)r   Zis_validr%   r(   )r   r   r<   r    r$   r   r   r   post   s    
zProcessFormView.postc             O   s   | j ||S )N)r>   )r   r<   r    r   r   r   put   s    zProcessFormView.putN)r+   r,   r-   r.   r=   r>   r?   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   r@      s   r@   c               @   s   e Zd ZdZdS )FormViewzJ
    A view for displaying a form, and rendering a template response.
    N)r+   r,   r-   r.   r   r   r   r   rA      s   rA   c                   s,   e Zd ZdZ fddZ fddZ  ZS )BaseCreateViewz
    Base view for creating an new object instance.

    Using this base class requires subclassing to provide a response mixin.
    c                s   d | _ tt| j|f||S )N)r1   r)   rB   r=   )r   r   r<   r    )r*   r   r   r=      s    zBaseCreateView.getc                s   d | _ tt| j|f||S )N)r1   r)   rB   r>   )r   r   r<   r    )r*   r   r   r>      s    zBaseCreateView.post)r+   r,   r-   r.   r=   r>   r/   r   r   )r*   r   rB      s   rB   c               @   s   e Zd ZdZdZdS )
CreateViewz\
    View for creating a new object instance,
    with a response rendered by template.
    _formN)r+   r,   r-   r.   template_name_suffixr   r   r   r   rC      s   rC   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t| j|f||S )N)
get_objectr1   r)   rF   r=   )r   r   r<   r    )r*   r   r   r=      s    
zBaseUpdateView.getc                s"   | j  | _tt| j|f||S )N)rG   r1   r)   rF   r>   )r   r   r<   r    )r*   r   r   r>      s    
zBaseUpdateView.post)r+   r,   r-   r.   r=   r>   r/   r   r   )r*   r   rF      s   rF   c               @   s   e Zd ZdZdZdS )
UpdateViewzP
    View for updating an object,
    with a response rendered by template.
    rD   N)r+   r,   r-   r.   rE   r   r   r   r   rH      s   rH   c               @   s,   e Zd ZdZdZdd Zdd Zdd ZdS )	DeletionMixinz9
    A mixin providing the ability to delete objects
    Nc             O   s$   | j  | _| j }| jj  t|S )zp
        Calls the delete() method on the fetched object and then
        redirects to the success URL.
        )rG   r1   r#   deleter   )r   r   r<   r    r!   r   r   r   rJ     s    

zDeletionMixin.deletec             O   s   | j |f||S )N)rJ   )r   r   r<   r    r   r   r   r>     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!   r7   r1   r8   r   )r   r   r   r   r#     s    zDeletionMixin.get_success_url)r+   r,   r-   r.   r!   rJ   r>   r#   r   r   r   r   rI      s
   rI   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   rK     s   rK   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 template.
    Z_confirm_deleteN)r+   r,   r-   r.   rE   r   r   r   r   rL     s   rL   N)Zdjango.core.exceptionsr   Zdjango.formsr   r5   Zdjango.httpr   Zdjango.utils.encodingr   Zdjango.views.generic.baser   r   r   Zdjango.views.generic.detailr	   r
   r   r   r0   r;   r@   rA   rB   rC   rF   rH   r1   rI   rK   rL   r   r   r   r   <module>   s"   VE