J'ai une vue personnalisée basée sur les classes
# myapp/views.py
from django.views.generic import *
class MyView(DetailView):
template_name = 'detail.html'
model = MyModel
def get_object(self, queryset=None):
return queryset.get(slug=self.slug)
Je veux passer le paramètre slug (ou d'autres paramètres à la vue) comme ceci
MyView.as_view(slug='hello_world')
Dois-je remplacer des méthodes pour pouvoir le faire?
self.kwargs.get('slug', None)
class View: def as_view(cls, **initkwargs): def view(request, *args, **kwargs):
url('<slug:slug>', MyView.as_view(), name='my_named_view')
Chaque paramètre passé à la
as_view
méthode est une variable d'instance de la classe View. Cela signifie que pour ajouter enslug
tant que paramètre, vous devez le créer en tant que variable d'instance dans votre sous-classe:Cela devrait
MyView.as_view(slug='hello_world')
fonctionner.Si vous passez les variables via des mots-clés, utilisez ce que M. Erikkson a suggéré: https://stackoverflow.com/a/11494666/9903
la source
import *
. J'ai modifié votre message.Il convient de noter que vous n'avez pas besoin de remplacer
get_object()
pour rechercher un objet basé sur un slug passé comme mot-clé arg - vous pouvez utiliser les attributs d'unSingleObjectMixin
https://docs.djangoproject.com/en/1.5/ref/ vues basées sur les classes / mixins-objet-unique / # singleobjectmixin(les deux
slug_field
etslug_url_kwarg
par défaut'slug'
)la source
Si vous souhaitez ajouter un objet au contexte du modèle, vous pouvez le remplacer
get_context_data
et l'ajouter à son contexte. La requête fait également partie de self au cas où vous auriez besoin de request.user .la source
MyObject
?Vous pouvez transmettre des paramètres depuis urls.py https://docs.djangoproject.com/en/1.7/topics/http/urls/#passing-extra-options-to-view-functions
Cela fonctionne également pour les vues génériques. Exemple:
Dans ce cas, les paramètres passés à la vue ne doivent pas nécessairement être des variables d'instance de la classe View. En utilisant cette méthode, vous n'avez pas besoin de coder en dur le nom de page par défaut dans le modèle YourView, mais vous pouvez simplement le passer en tant que paramètre d'urlconf.
la source
Comme l' a déclaré Yaroslav Nikitenko , si vous ne voulez pas coder une nouvelle variable d'instance à la classe View, vous pouvez passer des options supplémentaires pour afficher les fonctions de la
urls.py
manière suivante:Je voulais juste ajouter comment l'utiliser depuis la vue. Vous pouvez implémenter l'une des méthodes suivantes:
la source
DetailView
classe. Pourriez-vous expliquer comment l'utiliser là-bas?Pour django 3.0, c'est ce qui a fonctionné pour moi:
la source