Oui cela m'énerve trop.
Il y a du javascript-rendu-avec-Django-modèle de langue de la méthode est similaire à ce que vous avez affichée ci-dessus, cependant, j'ai trouvé assez rapidement que cela peut facilement devenir trop encombrant lorsque le javascript est stockée dans un fichier externe.
Il y a probablement de nombreuses façons de s'attaquer à ce problème, mais j'ai créé un simple helper app pour permettre la résolution d'url via AJAX. Il y a deux parties 2 parties -- le côté serveur l'url de la vue qui renvoie la valeur et le script côté client, qui fournit l'accès.
Il semble plus facile qu'elle ne l'est en réalité. Vous aurez souvent envie de passer des arguments dans l' resolve
fonction et souvent de l'ordre de ces arguments est très important. Pour maintenir l'ordre, lorsque je passe les arguments de retour de Django, je les orienter dans la chaîne de requête avec à la clé le n ° de leur ordre.
Une fois inclus (le javascript dépend de jQuery), vous pouvez y accéder avec...
// Equivalent to {% url blog_view_post post_id %}
var url = Django.reverse('blog_view_post', [post_id] );
Sur le côté serveur...
javascript/views.py
from django.http import HttpResponse
from django.core.urlresolvers import reverse
def reverse_url(request, url_name):
# Turn querystring into an array of couplets (2x list)
# arg_couplets = [ ('key', 'value'), ('key', 'value') ]
arg_couplets = request.REQUEST.items()
# Sort by keys
arg_couplets.sort(lambda x,y: cmp(x[0], y[0]))
# Collapse list into just the values
args = [c[1] for c in arg_couplets]
try:
if args:
return HttpResponse(reverse(url_name, args=args))
else:
return HttpResponse(reverse(url_name))
except:
return HttpResponse()
Sur le côté client... (assurez-vous d'inclure dans votre modèle)
/media/django-javascript.js
(function($) {
Django = function() {
return {
reverse: function(name, args) {
var ret;
var arguments = {};
var c = 0;
// Convert args to keyed dictionary
for (i in args) {
arguments[c] = args[i];
c++;
}
$.ajax({
async: false,
url: '/javascript/reverse/' + name + '/',
data: arguments,
success: function(html) {
ret = html;
}
});
if (ret.length > 0) {
return ret;
}
else {
return null;
}
}
}
}();
})(jQuery);
Sur une note de côté, j'ai aussi fait ça pour MEDIA_URL
et certains autres souvent utilisé les paramètres.