Imaginez une application avec le et ce url.py code>:
vues.py code>: p>
def double(request, number=42):
return HttpResponse(2*number)
3 Réponses :
Ce fil dit que la conversion automatique n'est pas une bonne solution: p>
Notez que la conversion automatique ne serait pas un bon plan, non plus. Pour exemple, la prochaine version de mon blog convertit les URL comme 2008/2/25 / à 2008/02/25 / parce que je veux une forme canonique. Donc j'ai besoin de savoir si \ d {1,2} correspond à l'un des deux chiffres, même si le premier est 0. La conversion automatique en un entier supprimerait cette capacité (et c'est pas difficile à penser à d'autres cas comme celui-ci). Donc, vous auriez besoin Configurabiliy. P> blockQuote>
Il suggère également une solution basée sur un décorateur, mais je ne suis pas vraiment convaincu, cela semble un peu lourd: p>
Une solution à votre problème pourrait être d'écrire un décorateur qui prend une liste de types (plus quelque chose comme aucun pour "ne pas s'en soucier") et convertit automatiquement l'argument n sur le type dans l'élément N-T ème de la liste avant d'appeler votre fonction p> blockQuote>
Voici une solution à base de décorateur:
def param_type(**type_spec): def deco(f): def view(request, **kwargs): for k, type_ in type_spec.items(): kwargs[k] = type_(kwargs[k]) return f(request, **kwargs) return view return deco @param_type(number=int) def double(request, number=42): return HttpResponse(2*number)
Merci ! Mais est-il considéré comme une bonne pratique? Ou si les paramètres URL doivent-ils être considérés comme quelque chose à éviter?
@Anto, je n'utilise personnellement pas de décorateur de conversion de type automatique. Je viens de le convertir manuellement dans le code de vue.
anto,
Je pense que votre question est plus liée à l'URL. Connaissant cela, vous pouvez supposer que: P> 1: le nombre aura toujours une valeur p>
2: le nombre sera toujours un entier (même que Django le renonce comme unicode) P>
blockquote> J'ai fait une petite modification à votre fonction: p> (? p
\ d code> uniquement en permettant des chiffres, il est identique à celui
[0-9] code>. Le symbole
+ code> indique qu'il a besoin de 1 ou plusieurs chiffres. Donc, si vous essayez d'insérer quelque chose comme
double / notanacher / code> il ne fonctionnera pas. P>
J'ai compris que, mais ma question est vraiment à propos de: Quelle est la la meilleure pratique i> pour gérer le type de ce numéro code> argore savoir que 1 / il sera toujours renvoyé par le résolveur URL En tant que chaîne et 2 / je aura toujours besoin d'un entier. C'est vraiment une question sur la meilleure pratique, désolé si je n'étais pas assez clair;)
Je pense que si vous savez que c'est toujours un numéro code> et la veut toujours comme un
integer code> Vous pouvez simplement utiliser
int () code>