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.
Réponses
Trop de publicités?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 surGET
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 quiPOST
s 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é.
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)