54 votes

Exemple de Django Classe DeleteView

Personne ne sait d'ou peut-on veuillez présenter un exemple simple de Django est basé sur une classe générique DeleteView? Je veux à la sous-classe DeleteView et de s'assurer que l'utilisateur actuellement connecté a la propriété de l'objet avant qu'il soit supprimé. Toute aide serait très appréciée. Je vous remercie à l'avance.

61voto

DrMeers Points 1805

Voici un exemple simple:

from django.views.generic import DeleteView
from django.http import Http404

class MyDeleteView(DeleteView):
    def get_object(self, queryset=None):
        """ Hook to ensure object is owned by request.user. """
        obj = super(MyDeleteView, self).get_object()
        if not obj.owner == self.request.user:
            raise Http404
        return obj

Mises en garde:

  • L' DeleteView ne sera pas effacer sur GET des demandes; c'est l'occasion de fournir une confirmation du modèle (vous pouvez fournir le nom de l' template_name de l'attribut de classe) avec un "Oui j'en suis sûr" bouton qui POSTs ce point de vue
  • Vous préférez peut-être un message d'erreur 404? Dans ce cas, remplacer l' delete méthode au lieu de cela, vérifiez les autorisations après l' get_object appel et retourner une réponse sur mesure.
  • N'oubliez pas de fournir un modèle qui correspond à l' (en option personnalisable) success_url de l'attribut de classe de sorte que l'utilisateur peut confirmer que l'objet a été supprimé.

43voto

Kurtis Points 554

J'ai essentiellement sous-classés certains de la Classe Générique Basée sur les points de Vue pour faire exactement cela. La principale différence est que je viens filtrés de la querysets. Je ne peux pas garantir que cette méthode est mieux ou pour le pire, mais il ne fait plus de sens pour moi.

Ignorez le "MessageMixin" -- qui est juste là pour présenter rapidement des Messages à l'aide du Django de Messagerie Cadre w/ une variable spécifiée pour chaque vue. Voici le code que j'ai écrit pour notre site:

Vues

from django.views.generic import CreateView, UpdateView, \
        DeleteView, ListView, DetailView

from myproject.core.views import MessageMixin

class RequestCreateView(MessageMixin, CreateView):
    """ 
    Sub-class of the CreateView to automatically pass the Request to the Form. 
    """
    success_message = "Created Successfully"

    def get_form_kwargs(self):
        """ Add the Request object to the Form's Keyword Arguments. """
        kwargs = super(RequestCreateView, self).get_form_kwargs()
        kwargs.update({'request': self.request})
        return kwargs

class RequestUpdateView(MessageMixin, UpdateView):
    """
    Sub-class the UpdateView to pass the request to the form and limit the
    queryset to the requesting user.        
    """
    success_message = "Updated Successfully"

    def get_form_kwargs(self):
        """ Add the Request object to the form's keyword arguments. """
        kwargs = super(RequestUpdateView, self).get_form_kwargs()
        kwargs.update({'request': self.request})
        return kwargs

    def get_queryset(self):
        """ Limit a User to only modifying their own data. """
        qs = super(RequestUpdateView, self).get_queryset()
        return qs.filter(owner=self.request.user)

class RequestDeleteView(MessageMixin, DeleteView):
    """
    Sub-class the DeleteView to restrict a User from deleting other 
    user's data.
    """
    success_message = "Deleted Successfully"

    def get_queryset(self):
        qs = super(RequestDeleteView, self).get_queryset()
        return qs.filter(owner=self.request.user)

L'utilisation de la

Ensuite, vous pouvez facilement créer vos propres points de vue à l'utilisation de ce type de fonctionnalités. Par exemple, je suis en train de les créer dans mon urls.py:

from myproject.utils.views import RequestDeleteView

#...

url(r'^delete-photo/(?P<pk>[\w]+)/$', RequestDeleteView.as_view(
                   model=Photo,
                   success_url='/site/media/photos',
                   template_name='site/media-photos-delete.html',
                   success_message='Your Photo has been deleted successfully.'
                   ), name='fireflie-delete-photo-form'),

Les formes

Important à noter: j'ai surchargé ceux get_form_kwargs() méthodes pour fournir mes Formulaires avec une instance de 'demande'. Si vous ne voulez pas l'objet de Demande transmis à la Forme, il suffit de supprimer ces méthodes surchargées. Si vous voulez les utiliser, suivez cet exemple:

from django.forms import ModelForm

class RequestModelForm(ModelForm):
    """
    Sub-class the ModelForm to provide an instance of 'request'.
    It also saves the object with the appropriate user.
    """
    def __init__(self, request, *args, **kwargs):
        """ Override init to grab the request object. """
        self.request = request
        super(RequestModelForm, self).__init__(*args, **kwargs)

    def save(self, commit=True):
        m = super(RequestModelForm, self).save(commit=False)
        m.owner = self.request.user
        if commit:
            m.save()
        return m

C'est un peu plus que vous avez demandé -- mais il est utile de savoir comment faire la même chose pour Créer et mettre à Jour les points de vue. Cette même méthode pourrait également être appliqué à la liste & fenêtrede travail.

MessageMixin

Juste au cas où quelqu'un veut que MessageMixin que j'utilise.

class MessageMixin(object):
    """
    Make it easy to display notification messages when using Class Based Views.
    """
    def delete(self, request, *args, **kwargs):
        messages.success(self.request, self.success_message)
        return super(MessageMixin, self).delete(request, *args, **kwargs)

    def form_valid(self, form):
        messages.success(self.request, self.success_message)
        return super(MessageMixin, self).form_valid(form)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X