Python 下拉更改后来自模板的Django AJAX调用/url

Python 下拉更改后来自模板的Django AJAX调用/url,python,ajax,django,Python,Ajax,Django,如何让django正确地告诉我要发送到的url,这样我就可以避免硬编码,以及如何在JS中这样做,一旦它被送达(我可以用除了recipe\u pk之外的所有内容来获取url,然后在JS中进行处理?) url/路由器 看法 我会在上下文中添加一个模板字符串,然后用它替换url i、 在我看来 from django.urls import reverse def view_that_renders_javascript(request): reversed_path = reverse('

如何让django正确地告诉我要发送到的url,这样我就可以避免硬编码,以及如何在JS中这样做,一旦它被送达(我可以用除了
recipe\u pk
之外的所有内容来获取url,然后在JS中进行处理?)

url/路由器 看法
我会在上下文中添加一个模板字符串,然后用它替换url

i、 在我看来

from django.urls import reverse

def view_that_renders_javascript(request):
    reversed_path = reverse('recipes:newRecipeAJAX', kwargs={'recipe_pk':1})
    ajax_path = '/'.join(reversed_path.split('/')[:-2]) + '/'  # '/recipe/AJAX/`
    context = {
        'ajax_path': ajax_path
    }
    return render(request, 'your_template.html', context)
然后在模板内部

{% block script_inline %}
  $(function(){
    var ajaxPath = '{{ajax_path}}';
    $('#form-dropdown').change(function () {
      var recipe_pk = $(this).val();
      request_url = ajaxPath + recipe_pk + '/';
      alert(request_url);
      // AJAX Land
    });
  });
{% endblock script_inline %}
总的来说,我觉得这是django鼓励的一种反模式:通过模板注入运行时Javascript信息。就我个人而言,我会让客户端通过API端点加载运行时配置,这样服务器负责提供信息,客户端负责运行时状态——但当您在标准Django鼓励的每个操作(即Django表单等)之后执行页面加载时,这会变得更加麻烦。这种职责的混合可能是bug的一大来源


有了这个警告,这应该与您所拥有的以及您试图实现的目标相一致。

更改url格式化的模板行,如下所示:

var recipe_pk = $(this).val();
request_url = "{% url 'recipes:newRecipeAJAX' '999' %}".replace('999', recipe_pk);
说明:当django生成HTML时,url标记将在服务器端进行解释,形成以下javascript:

request_url = "/path/to/recipe/AJAX/999/".replace('999', recipe_pk);
如果您在浏览器中查看源代码,您将看到这一点

然后,在客户端,当执行javascript时,它将用
recipe\u pk
的值替换
999

使用任何您喜欢的占位符,而不是999。。如果需要替换采用字符串参数的参数,则可以使用更传统的参数,例如
\uuuu ARG\uuu
。因为url正则表达式在这种情况下需要一个整数,所以占位符必须是整数


这是我想出的最好的办法。。在模板中只需要少量的额外代码,而在python中则不需要。不幸的是,Django最初设计时并没有考虑AJAX。。。如果有一个特殊的反向函数,它返回包含参数名的URL作为占位符来代替参数值,那就太好了,但据我所知,没有。我想这应该可以解决您的问题

$(function(){
    $('#form-dropdown').change(function () {
    var recipe_pk = $(this).val();
    request_url = "recipe/AJAX"+recipe_pk
    alert(requst_url);
    // AJAX Land
});


您的url以
结尾。你检查过这个了吗?
var recipe_pk = $(this).val();
request_url = "{% url 'recipes:newRecipeAJAX' '999' %}".replace('999', recipe_pk);
request_url = "/path/to/recipe/AJAX/999/".replace('999', recipe_pk);
$(function(){
    $('#form-dropdown').change(function () {
    var recipe_pk = $(this).val();
    request_url = "recipe/AJAX"+recipe_pk
    alert(requst_url);
    // AJAX Land
});
$(function(){
    $('#form-dropdown').change(function () {
    var recipe_pk = $(this).val();
    $.ajax({
        url: "recipe/AJAX"+recipe_pk,
        success: function(data){

        },/*./success*/
        error: function(xhr, status, error) {

        }/*  end of error */
    });
});