javascript - include 标签内的 url 标签中的 NoReverseMatch

标签 javascript python django django-templates

我正在尝试使用 url 标记在包含 html 模板中呈现链接。 我以前这样做过,通常都能成功,但由于某种原因,这次我做不到。

我收到 NoReverseMatch 错误并怀疑它是因为 Django 尝试首先加载 url 标记,但我的对象尚未准备好,因此 pk 为空。我相信这是因为动态数据加载需要一些时间,而静态数据已经加载。

如果我将 pk 设置为固定数字,则该网址有效,但我希望它能够动态更改。

错误:

Reverse for 'transaction' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['en/budget/account\\/(?P<pk>[0-9]+)\\/$']

相关网址:

from django.urls import path
from django.contrib import admin
from django.contrib.auth import views as auth_views
from . import views

app_name='budgetapp'

urlpatterns = [
    path('', views.index, name='index'),
    path('account/<int:pk>/', views.transaction, name='transaction'),
    path('account/', views.account, name='account'),
    ]

相关观点:

from django.shortcuts import get_object_or_404, render, redirect
from django.contrib.auth.models import Group
from django.contrib.auth.decorators import login_required, user_passes_test
from .models import *
from .forms import *

def index(request):
    context = {}
    context['accounts'] = Account.objects.filter(author=request.user)
    return render(request, 'budgetapp/index.html', context)

def account(request):
    context = {}
    context['account'] = get_object_or_404(Account, pk = request.POST['accountPk'])
    return render(request, 'budgetapp/account.html', context)

def transaction(request, pk):
    context = {}
    context['account'] = get_object_or_404(Account, pk = pk)
    return render(request, 'budgetapp/addTransaction.html', context)

index.html:

{% csrf_token %}
    <h1>Personal Budget</h1>
    <br />
    <p>
        <label for="accountSelector">Account:</label>
        <select required = "" id="accountSelector">
            {% for account in accounts %}
                <option value="{{account.pk}}">{{account}}</option>
            {% endfor %}
        </select>
    </p>
    <hr />
    {% include 'budgetapp/account.html' %}
<script>
    $(document).ready(function () {
        reload();
    });
    $("#accountSelector").change(function () {
        reload();
    });
    function reload() {
        var dictionary = {}
        dictionary['csrfmiddlewaretoken'] = $('input[name="csrfmiddlewaretoken"]').val();
        dictionary['accountPk'] = $('#accountSelector').val();

        $('#accountDiv').load("account/", dictionary);
        console.log('Changed account');
    }
</script>

帐户.html:

<div id="accountDiv">
    <p>
        Name: {{account.name}} &nbsp; Account balance: {{account.balance}}&ensp;<a href="{% url 'budgetapp:transaction' pk=account.pk %}">Add a transaction</a>
    </p>
</div>

如果我将 {% url 'budgetapp:transaction' pk=account.pk %} 更改为 /budget/account/{{account.pk}} ,它就可以工作,但感觉不对。 我尝试提供所有必要的代码,但如果代码过多或缺少某些内容,请告诉我。

最佳答案

如果您想使用{% url 'budgetapp:transaction' pk=account.pk %},则帐户必须位于模板上下文。这与您的浏览器动态加载数据无关。在将响应发送到浏览器之前,整个模板由服务器呈现。

使用 /budget/account/{{account.pk}} 不会给出错误,但如果您查看呈现的 HTML,您会看到 /budget/account/ 因为 {{ account.pk }} 将计算为 ''

关于javascript - include 标签内的 url 标签中的 NoReverseMatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49491438/

相关文章:

javascript - 将 WebGL 非连续线渲染为单个对象

javascript - Protractor 如何得到可靠的结果?

Python – time.time() 与 bash 时间

python - 检查ManyToMany字段中的对象是否为Django Rest框架

python - Django,序列化关系,对象而不是id

python - Django:创建一个不是主键唯一的列

javascript - 单击 P5.JS 中的 Triangle 项目允许单击三 Angular 形修复之外

Javascript 区分大小写过滤器

python - 外部文件中的 SQLAlchemy 枚举

python - 导入错误 : cannot import name inplace_column_scale