【问题标题】:using reverse url in javascript在 javascript 中使用反向 url
【发布时间】:2023-01-20 17:44:17
【问题描述】:

我需要将事件侦听器添加到标准的 Django 选择字段。
听众将(在未来)做 htmx.ajax 调用(https://htmx.org/api/#ajax

网址.py

from django.urls import path
from .views import mailtemplate_GetSchema, refresh_schema

from .views import surat_schema_table
urlpatterns = [
    path('htmx/surat_schema_table/<str:template_id>', surat_schema_table, name='surat_schema_table'),

]

目前我有一个测试模板。
这个模板不会做ajax调用,只显示最终被调用的url

表单模板 ( surat_form_htmx.html )

{% extends "admin/change_form.html" %}
{% block after_field_sets %}

  <!--- add htmx -->
  <script src="https://unpkg.com/htmx.org@1.6.0"></script>

  <style>
    /* DivTable.com */
    .divTable{
      display: table;
      width: 100%;
    }
    .divTableRow {
      display: table-row;
    }
    .divTableCell, .divTableHead {
      border: 1px solid #999999;
      display: table-cell;
      padding: 3px 10px;
    }
    .divTableHeading {
      display: table-header-group;
      font-weight: bold;
    }
    .divTableFoot {
      background-color: #EEE;
      display: table-footer-group;
      font-weight: bold;
    }
    .divTableBody {
      display: table-row-group;
    }
  </style>
  <!-- EOF evt listener id_template -->
  Obj ID: <input id="loaded_object" id="loaded_object" type="text" size="20" readonly {% if not add %} value="{{ obj_id }}" {% endif %}>
  Selected Template: <input id="selected_template" name="selected_template" type="text" size="20" readonly >
  url: <input id="call_url" name="call_url" type="text" size="20" readonly >

  <script>
    const selectElement = document.querySelector("#id_template");

    selectElement.addEventListener('change', (event) => {
      var result = document.getElementById("id_template").value ;
      var url_final={% url surat_schema_table result %} ;
      document.getElementById('selected_template').value = result;
      document.getElementById('call_url').value = url_final;

    });

</script>
  <!-- EOF evt listener id_template -->

  <div id="container_for_surat_schema_table">

  </div>
{% endblock %}

管理员.py


from django.contrib import admin
from .models import Surat

class SuratAdmin(admin.ModelAdmin):
  change_form_template = 'surat_form_htmx.html'

admin.site.register(Surat, SuratAdmin)

目前它在加载时产生回溯:



Request Method: GET
Request URL: http://127.0.0.1:8000/admin/myapp/surat/add/

Django Version: 4.1.5
Python Version: 3.10.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'myapp.apps.MyappConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template /home/bino/Documents/dynform/htmx01/myapp/templates/surat_form_htmx.html, error at line 44
   Reverse for '' not found. '' is not a valid view function or pattern name.
   34 :   <!-- EOF evt listener id_template -->
   35 :   Obj ID: <input id="loaded_object" id="loaded_object" type="text" size="20" readonly {% if not add %} value="{{ obj_id }}" {% endif %}>
   36 :   Selected Template: <input id="selected_template" name="selected_template" type="text" size="20" readonly >
   37 :   url: <input id="call_url" name="call_url" type="text" size="20" readonly >
   38 : 
   39 :   <script>
   40 :     const selectElement = document.querySelector("#id_template");
   41 : 
   42 :     selectElement.addEventListener('change', (event) => {
   43 :       var result = document.getElementById("id_template").value ;
   44 :       var url_final= {% url surat_schema_table result %}  ;
   45 :       document.getElementById('selected_template').value = result;
   46 :       document.getElementById('call_url').value = url_final;
   47 : 
   48 :     });
   49 : 
   50 : </script>
   51 :   <!-- EOF evt listener id_template -->
   52 : 
   53 :   <div id="container_for_surat_schema_table">
   54 : 


Traceback (most recent call last):
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/core/handlers/base.py", line 220, in _get_response
    response = response.render()
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/response.py", line 114, in render
    self.content = self.rendered_content
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/response.py", line 92, in rendered_content
    return template.render(context, self._request)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/backends/django.py", line 62, in render
    return self.template.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 175, in render
    return self._render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
    return self.nodelist.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
    return compiled_parent._render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
    return self.nodelist.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
    return compiled_parent._render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
    return self.nodelist.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
    return compiled_parent._render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
    return self.nodelist.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/template/defaulttags.py", line 472, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/urls/base.py", line 88, in reverse
    return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)
  File "/home/bino/.venv/htmx01/lib/python3.10/site-packages/django/urls/resolvers.py", line 828, in _reverse_with_prefix
    raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /admin/myapp/surat/add/
Exception Value: Reverse for '' not found. '' is not a valid view function or pattern name.

看起来'var result'被模板读取为“''”。

我的问题是:
如何在 javascript 中使用/调用 django 模板中“var”中的变量的反向 url。

【问题讨论】:

    标签: javascript django htmx


    【解决方案1】:

    var url_final={% url surat_schema_table 结果%}

    应该像 var url_final={% url "surat_schema_table" template_id="..." %}

    (必须符合 urlspattern 定义)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-14
      • 2012-07-22
      • 2012-08-07
      • 2013-09-09
      • 2015-10-26
      • 2010-12-03
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多