Django - 视图中的参数而不是网址中的参数
Django - parameters in view and not in urls
我有这个代码:
我的看法:
members_pj(request,lesc,p,np):
...
我的模板:
... href="{% url 'members_pj' lesc p np %}" ...
还有我的 urls :
url(r'^lesps/(?P<np>\w+)/members','members_pj', name="memberspj"), ...
事实上,我不希望 url 中有参数 lesc 和 p...只是 np。
它是怎么做到的?
谢谢
Django 的 url 标签将视图名称和参数反转为 url,这意味着 url 配置必须与视图的参数一致。我认为您目前拥有的内容会导致 NoReverseMatch
django 错误。为避免这种情况,请将 url 配置更改为:
url(r'^lesps/(?P<lesc>\w+)/(?P<p>\w+)/(?P<np>\w+)/members','members_pj', name="memberspj"), ...
这将使 link 通过 url 配置解析为正确的视图。
然而,接下来的事情是您不希望参数显示在您的 url 中。通常,GET 请求(当您单击 link 时发出的请求)没有 body,这意味着所有内容都在 headers 或 url 中。如果您想通过发送该信息,但不在 url 中,则需要使用 javascript 构建请求。这是一个例子:
在您看来:
<a href="{% url 'members_pj' np %}" data-lesc="{{lesc}}" data-p="{{p}}">
Content
</a>
在javascript中:
// From http://whosebug.com/a/133997/1467342
function post(path, params, method) {
method = method || "post"; // Set method to post by default if not specified.
// The rest of this code assumes you are not using a library.
// It can be made less wordy if you use one.
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", path);
for(var key in params) {
if(params.hasOwnProperty(key)) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", params[key]);
form.appendChild(hiddenField);
}
}
document.body.appendChild(form);
form.submit();
}
var links = document.querySelectorAll('a');
for (var i = 0; i < links.length; i++) {
links[i].addEventListener('click', function (evt) {
evt.preventDefault();
post(this.getAttribute('href'), {
lesc: this.getAttribute('data-lesc'),
p: this.getAttribute('data-p')
});
});
}
我有这个代码:
我的看法:
members_pj(request,lesc,p,np):
...
我的模板:
... href="{% url 'members_pj' lesc p np %}" ...
还有我的 urls :
url(r'^lesps/(?P<np>\w+)/members','members_pj', name="memberspj"), ...
事实上,我不希望 url 中有参数 lesc 和 p...只是 np。 它是怎么做到的?
谢谢
Django 的 url 标签将视图名称和参数反转为 url,这意味着 url 配置必须与视图的参数一致。我认为您目前拥有的内容会导致 NoReverseMatch
django 错误。为避免这种情况,请将 url 配置更改为:
url(r'^lesps/(?P<lesc>\w+)/(?P<p>\w+)/(?P<np>\w+)/members','members_pj', name="memberspj"), ...
这将使 link 通过 url 配置解析为正确的视图。
然而,接下来的事情是您不希望参数显示在您的 url 中。通常,GET 请求(当您单击 link 时发出的请求)没有 body,这意味着所有内容都在 headers 或 url 中。如果您想通过发送该信息,但不在 url 中,则需要使用 javascript 构建请求。这是一个例子:
在您看来:
<a href="{% url 'members_pj' np %}" data-lesc="{{lesc}}" data-p="{{p}}">
Content
</a>
在javascript中:
// From http://whosebug.com/a/133997/1467342
function post(path, params, method) {
method = method || "post"; // Set method to post by default if not specified.
// The rest of this code assumes you are not using a library.
// It can be made less wordy if you use one.
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", path);
for(var key in params) {
if(params.hasOwnProperty(key)) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", params[key]);
form.appendChild(hiddenField);
}
}
document.body.appendChild(form);
form.submit();
}
var links = document.querySelectorAll('a');
for (var i = 0; i < links.length; i++) {
links[i].addEventListener('click', function (evt) {
evt.preventDefault();
post(this.getAttribute('href'), {
lesc: this.getAttribute('data-lesc'),
p: this.getAttribute('data-p')
});
});
}