【问题标题】:Django render and redirect URLDjango 渲染和重定向 URL
【发布时间】:2019-12-04 08:21:13
【问题描述】:

您好,我是 Django 的新手,我目前在弄清楚如何重定向和返回值时遇到问题

我有一个带有 monthyear 两个参数的网址。单击它后,它应该重定向到带有 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 获取月份和年份到我的视图函数

【问题讨论】:

    标签: python django redirect


    【解决方案1】:

    您需要更新视图以传递年份和月份参数:

    def list_working_sessions(request, year, month):
        flag_date = []
        working_session_list = []
    
        if request.method == 'GET':
            # removed request.GET.get(...) because year and month arguments coming direct in from url and view arguments
            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

    更新我觉得你可以这样试试:

    # url
    url(r'^list-working-sessions/', 
        views.list_working_sessions, 
        name='list_working_sessions')
    
    # view(same as your question)
    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'))
        # rest of the code
        url = '{}?year={}&month={}'.format(reverse('list_working_sessions'), year, month)
    
    # template:
    {% now "Y" as YEAR %}
    {% now "m" as MONTH %}
    <a href="{% url 'list_working_sessions' %}?year={{ YEAR }}&month={{ MONTH }}">
    

    Update2我想你可以这样尝试:

    # url
    url(r'^list-working-sessions/', 
        views.list_working_sessions, 
        name='list_working_sessions'),
    url(r'^list-working-sessions/(?P<year>\w+?)/(?P<month>\w+?)/$', 
        views.list_working_sessions, 
        name='list_working_sessions_updated')
    
    # view
    def list_working_sessions(request, year=None, month=None):
        flag_date = []
        working_session_list = []
        redirect = False
        if request.method == 'GET':
            if not month:
                month = int(request.GET.get('month'))
                redirect = True
            if not year:
                year = int(request.GET.get('year'))
                redirect = True
        # other codes
        if not redirect:
             return render(...)
        else:
             url = reverse('list_working_sessions_updated', kwargs={'year': year, 'month': month})
             return HttpResponseRedirect(url)
    
    
    # template:
    {% now "Y" as YEAR %}
    {% now "m" as MONTH %}
    <a href="{% url 'list_working_sessions_updated' year=YEAR month=MONTH %}">
    

    【讨论】:

    • 我在问题的编辑中进行了更改,当单击 base.html 中的 url 时,它工作并获得了默认的月份和年份 url,但是当我尝试使用 GET 表单进行搜索时,我得到以下信息url 页面未找到 (404) 请求方法:GET 请求 URL:localhost:8888/list_working_sessions_get?month=8&year=2019 在我看来我无法从表单 GET url 获取参数
    • 不行,你需要匹配url签名。但是你可以试试这个答案的更新部分
    • 我在 /list-working-sessions/list_working_sessions() 出现 TypeError,缺少 2 个必需的位置参数:base.html url 中的“月”和“年”,它无法获取月份和年份价值?
    • 哦,很好用,但 url 现在是 '/list-working-sessions/?month=8&year=2019' 这不是我在视图中写的重定向 url 格式应该是 '/list -working-sessions/2019/8' 有什么要改的吗?我会接受答案,因为它有助于我的代码流工作:))
    • 嗯它不会改变我的网址,似乎 url = '{}?month={}&year={}'.format(reverse('list_working_session'), month, year) return HttpResponseRedirect(url) 部分甚至没有使用
    猜你喜欢
    • 2010-12-25
    • 2017-11-10
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2019-03-01
    • 2020-06-30
    • 2023-04-02
    • 2013-02-04
    相关资源
    最近更新 更多