【发布时间】:2019-12-04 08:21:13
【问题描述】:
您好,我是 Django 的新手,我目前在弄清楚如何重定向和返回值时遇到问题
我有一个带有 month 和 year 两个参数的网址。单击它后,它应该重定向到带有 URL 的页面,例如“list-working-sessions/year/month”,其中包含基于操作的年份和月份参数。
urls.py
url(r'^list-working-sessions/(?P<year>\w+?)/(?P<month>\w+?)/$',
views.list_working_sessions,
name='list_working_sessions')
base.html
<ul class="treeview-menu">
<li id="list-daily-task">
<a href="{% url 'list_working_sessions' %}">
<i class="fa fa-circle-o"></i>List Working Session</a>
</li>
</ul>
页面有一个表格和一个表格,可以按月和年搜索:
list_working_sessions.html
<div class="box">
<div class="box-header">
<center>
<h3 class="box-title">List Working Sessions</h3>
</center>
</div>
<!-- /.box-header -->
<div class="box-body">
<form class="form-horizontal" action="/list-working-sessions" method="GET">
{% csrf_token %}
<div class="table-responsive">
<table class="table table-borderless" id="dynamic_field">
<tr>
<th style="width:20%; border-top:none">Month</th>
<th style="width:20%; border-top:none">Year</th>
<th style="width:20%; border-top:none"></th>
<th style="border-top:none"></th>
</tr>
<tr>
<td style="border-top:none">
<select name="month" class="form-control" id="month" required>
<option value="1" selected>1</option>
<option value="2" selected>2</option>
<option value="3" selected>3</option>
<option value="4" selected>4</option>
<option value="5" selected>5</option>
<option value="6" selected>6</option>
<option value="7" selected>7</option>
<option value="8" selected>8</option>
<option value="9" selected>9</option>
<option value="10" selected>10</option>
<option value="11" selected>11</option>
<option value="12" selected>12</option>
</select>
</td>
<td style="border-top:none">
<select name="year" class="form-control" id="year" required>
<option value="2019" selected>2019</option>
<option value="2020" selected>2020</option>
</select>
</td>
<td style="border-top:none"><button type="submit" id="submit" class="btn btn-info">Send</button></td>
</tr>
</table>
</div>
</form>
<table id="example1" class="table table-bordered table-striped">
<thead>
<tr>
<th>Date</th>
<th>Working Sessions</th>
<th>Duration</th>
</tr>
</thead>
<tbody>
{% for lws in working_session_list|dictsortreversed:"date"%}
<tr>
<td>{{lws.date}}</td>
<td>
<ul class="list-group">
{% for lgbd in lws.list_group_by_date %}
<ul>
{% for item in lgbd.items %}
<li>{{item.start.time}} - {{item.end.time|default:"Not ended yet" }}</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
</td>
<td>
{{lws.sum_duration}} minutes
</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
</tfoot>
</table>
</div>
<!-- /.box-body -->
</div>
如果从 base.html 中单击链接,则它将返回 list_working_sessions.html 页面,其中包含当前月份和年份的表值(工作会话对象),并且 url 具有当前月份和年份参数。如果链接是来自表单的 GET 请求,那么它将返回包含搜索月份和年份的表值的页面,并且 url 还包含该参数
我编写了以下视图,以便它在 1 个函数中处理所有内容,但我在弄清楚如何从函数重定向和返回值以及更改 url 参数时遇到问题。我习惯于做 POST 表单请求,但之前从未使用 GET 表单请求进行重定向
views.py:
def list_working_sessions(request):
flag_date = []
working_session_list = []
if request.method == 'GET':
month = int(request.GET.get('month'))
year = int(request.GET.get('year'))
daily_working_sessions = WorkingSession.objects.filter(device__employee_id=request.user,start__month=month,start__year=year).order_by('-start')
else:
month = datetime.today().month
year = datetime.today().year
daily_working_sessions = WorkingSession.objects.filter(device__employee_id=request.user).order_by('-start')
for item in daily_working_sessions:
if item.start.date() not in flag_date:
flag_date.append(item.start.date())
list_group_by_date = []
group_by_date = daily_working_sessions.filter(start__date=item.start.date())
list_group_by_date.append({
"items": group_by_date
})
sum_duration = 0
for item in group_by_date:
sum_duration += item.get_duration
working_session_list.append({
"date": str(item.start.date()),
"list_group_by_date": list_group_by_date,
"sum_duration": sum_duration
})
num_days = calendar.monthrange(year, month)[1]
days = [date(year, month, day) for day in range(1, num_days+1)]
for day in days:
if day not in flag_date:
working_session_list.append({
"date": day.strftime('%Y-%m-%d'),
"list_group_by_date": '',
"sum_duration": '0'
})
return render(request, 'pages/list_working_sessions.html', {
'working_session_list': working_session_list,
'state': 'list-working-sessions'
})
url = reverse('list_working_sessions', kwargs={'year': year, 'month': month})
return HttpResponseRedirect(url)
编辑: 我将 base.html 更改为
{% now "Y" as YEAR %}
{% now "m" as MONTH %}
<a href="{% url 'list_working_sessions' year=YEAR month=MONTH %}">
错误消失了,但是当我单击 base.html 中的 url 时得到了这个
/list-working-sessions/2019/07/list_working_sessions() 处的类型错误 得到了一个意外的关键字参数“年份”
编辑 2: 我将视图功能更改为:
def list_working_sessions(request, month, year):
flag_date = []
working_session_list = []
month = int(month)
year = int(year)
daily_working_sessions = WorkingSession.objects.filter(device__employee_id=request.user,start__month=month,start__year=year).order_by('-start')
base.html 中的 URL 返回正确的重定向 URL '/list-working-sessions/2019/7/' 和表中的值,但是当我使用表单搜索时,URL 不同
Page not found (404)
Request Method: GET
Request URL: http://localhost:8888/list_working_sessions_get?month=8&year=2019
似乎无法从这个 URL 获取月份和年份到我的视图函数
【问题讨论】: