J’ai créé un petit middleware Django qui agit comme le ParamConverter Doctrine de Symfony et j’ai voulu le partager avec vous.
Pour ceux qui ne connaissent pas, il s’agit d’un convertisseur de paramètre du contrôleur qui converti un paramètre en l’instance du modèle correspondant au type fourni.
<?php
// src/Sdz/BlogBundle/Controller/BlogController.php
use Sdz\BlogBundle\Entity\Article;
public function voirAction($id, Article $article)
{
// Ici, $article est une instance de l'entité Article, portant l'id $id
}
Comme l’indique le commentaire, la variable $article sera une instance de l’entité Article.
J’ai fait la même chose avec Django grâce aux annotations de Python 3.
Voici le middleware en question :
from django.db import models
class ModelViewArgumentsMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
for key in view_kwargs:
if key in view_func.__annotations__ and issubclass(view_func.__annotations__[key], models.Model):
view_kwargs[key] = get_object_or_404(view_func.__annotations__[key], pk=view_kwargs[key])
Il s’utilise d’une façon très simple. Il suffit d’annoter un paramètre d’une vue avec la classe correspondant au modèle.
Par exemple, pour reprendre l’exemple du TP du raccourcisseur d’URL du tutoriel de Django, on pourrait ajouter une vue voir qui utilise une annotation afin d’éviter l’appel à get_object_or_404() :
def voir(request, mini_url : MiniURL):
#mini_url = get_object_or_404(MiniURL, pk=mini_url) # Maintenant inutile grâce à l’annotation.
return render(request, 'mini_url/voir.html', {'mini_url': mini_url})
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.