【发布时间】:2017-04-11 01:36:00
【问题描述】:
我是使用 Django 甚至创建网站的新手,所以如果我对我所面临的问题提供的细节太少/太多,请多多包涵。此外,我上周大部分时间都在浏览 SO 页面、博客、Django 教程、Django 文档等,试图自己解决问题。也许我忽略了某些事情,或者我只是不走运,但我发现的任何东西都无法完全解决我的特殊情况。大多数示例似乎都侧重于处理 views.py 中的请求,而不是如何在 Django 模板中发出原始请求。
我有一个 Django 模板 view_table.html,它向用户显示一个 Bootstrap DataTable 表对象。此表的第二列是名为 MyRow_ID 的 BigIntegerField。我目前在 MyCode.js 中有代码,允许用户突出显示多行,当单击按钮 modify_button 时,MyRow_ID 值选定的行(例如 [2, 13, 14])被捕获到名为 sent_data 的 JS 字典中。捕获这些值后,我希望 modify_button 创建一个 GET 请求,该请求会随之发送 sent_data。在 urls.py 中匹配并调用 views.py 中的 modify_data 函数后,modify_data 应该会呈现一个新页面modify_table.html 同时传回与 MyRow_ID 匹配的模型实例,以便仅显示所选行的数据。我想我已经很接近了,也许我只需要对正则表达式进行调整,但这是我的问题:
- 如何在 Django 模板 view_table.html 中创建将 sent_data 传递给 Django 的 GET 请求?目前我正在使用一个表单,其中 method 和 action 属性设置为 "GET" 和 "{% url 'modify_data' sent_data=sent_data %}"。我假设应该使用 GET 而不是 POST,因为请求没有修改后端,它更像是“过滤视图”类型的请求。这是一个正确的假设吗?请求的 url 是什么样的?假设 MyRow_ID 值为 [2,13,14]。获取请求是否类似于 /modify_data/matched_row_1=2&matched_row_2=13&matched_row_3=14?我是否必须自己在模板中通过迭代 sent_data 并附加“matched_row_n=”字符串来创建这个 url 字符串,还是有更简单的方法让模板在请求中自动创建它?
- 应该在 myapp/urls.py 中使用什么正确的正则表达式模式,因为 sent_data 可能有 1 到 n 个唯一的 MyRow_ID 值,假设分别选择了 1 到 n 行? (显然,健壮的代码将包括处理选择 0 行并单击 modify_button 的情况,但我们暂时将其放在一边。)目前我在 /myapp/view_data/ 处遇到 NoReverseMatch 错误:使用参数“()”和关键字参数“{u'sent_data': ''}' 反转'modify_data'。 我是使用正则表达式的新手,我知道我在 myapp/urls.py 是错误的。
- myapp/views.py 中的代码是否可以正确过滤匹配的模型实例并使用所选行呈现 modify_table.html?
view_table.html:
<!DOCTYPE html>
<html>
<head>
## Bunch of code… ##
</head>
<body>
<div class="col col-xs-12 text-right">
<form style="display" method="get" action="{% url 'modify_data' sent_data=sent_data %}">
<button id="modify_button" type="button" class="btn btn-primary btn-create">Modify Data</button>
</form>
</div>
<br><br><br>
<table id="my_table">
## Code that displays my_table ##
</table>
<!-- Execute JS scripts -->
<script type="text/javascript" src="{% static "myapp/js/jquery-1.12.0.min.js" %}"></script>
<script type="text/javascript" src="{% static "myapp/js/jquery.dataTables.min.js" %}"></script>
<script type="text/javascript" src="{% static "myapp/js/bootstrap.min.js" %}"></script>
<script type="text/javascript" src="{% static "myapp/js/dataTables.bootstrap.min.js" %}"></script>
<script type="text/javascript">
var sent_data = [];
</script>
<script type="text/javascript" src="{% static "myapp/js/MyCode.js" %}"></script>
</body>
</html>
MyCode.js:
$(document).ready(function(){
var oTable = $('#my_table').DataTable();
var selected_data = [];
$('#my_table tbody').on('click','tr',function(){
$(this).toggleClass('active');
});
$('#modify_button').click(function(event){
selected_data = $.map(oTable.rows('.active').data(), function (item) {
return item[1]
});
sent_data = { 'modify_rows': selected_data };
});
});
我应该注意我使用的是 MyRow_ID 而不是本机 DataTable 属性 rowID 因为我假设 DataTable 是自动创建的 rowID与 Django 使用的自动创建的主键 (pk) 不匹配。这是一个正确的假设吗?
myapp/urls.py:
from django.conf.urls import url
from . import views
from .models import MyDataModel
urlpatterns = [
url(r'^view_data/$', views.view_data, name='view_data'),
url(r'^modify_data/(?P<sent_data>\d+)/$', views.modify_data, name='modify_data'),
]
myapp/views.py:
from django.forms import modelformset_factory
from django.shortcuts import render
from django.http import HttpResponse
from .models import MyDataModel
def view_data(request):
myData = MyDataModel.objects.all()
return render(request, 'myapp/view_table.html', {'myData': myData})
def modify_data(request, sent_data):
MyDataFormSet = modelformset_factory(MyDataModel, fields=('MyRow_ID','MyRow_Text'))
if request.method == 'GET':
selected_rows = sent_data['modify_rows']
## selected_rows = request.GET['modify_rows']
formset = MyDataFormSet(queryset=MyDataModel.objects.filter(MyRow_ID__in=selected_rows))
selected_data = MyDataModel.objects.filter(MyRow_ID__in=selected_rows)
return render(request, 'myapp/modify_data.html', {'formset': formset, 'selected_data': selected_data})
else:
return HttpResponse('A GET request was not received.')
最后,modify_data.html:
<!DOCTYPE html>
<html>
<head>
## Bunch of code… ##
</head>
<body>
<div class="col col-xs-12 text-right">
<form method="post" action="">
{% csrf_token %}
{{ formset }}
<button id="submit_changes" type="button" class="btn btn-primary btn-create">Submit Changes</button>
</form>
</div>
<br><br><br>
<table id="selected_rows_table">
## Code that displays selected rows passed as selected_data ##
</table>
</body>
</html>
非常感谢您的帮助,提前感谢您!
【问题讨论】:
标签: javascript html django-templates django-views django-urls