“page” GET 参数从何而来?

Posted

技术标签:

【中文标题】“page” GET 参数从何而来?【英文标题】:Where does the "page" GET parameter come from? 【发布时间】:2018-09-09 19:47:34 【问题描述】:

我是 Django 的初学者,对于 Django 引擎盖下的实际工作方式,我深思熟虑。我目前正在我的网络应用中实现分页。

看看这个 view.py 文件:

def post_list(request):

    object_list = Post.published.all(); # '.published' is a manager.

    paginator = Paginator(object_list, 3); # 3 posts in each page.
    page = request.GET.get("page");

    try:

        posts = paginator.page(page);

    except PageNotAnInteger:

        posts = paginator.page(1);

    except EmptyPage:

        posts = paginator.page(paginator.num_pages);

    return render(request, "post/list.html", "page": page, "posts": posts);

request.GET 不是一个字典对象,包含了 url 中所有的 GET 请求参数,以及用于返回值的 .get() 方法 对于参数内的给定键?当我启动应用程序时,由于我的 URL 目前只是 localhost:8000,为什么如果我传递密钥“页面”它会起作用?

我的 list.html 文件:

% extends "base.html" %

% block title %My Blog% endblock %

% block content %

  <h1>My Blog</h1>
  % for post in posts %
    <h2><a href=" post.get_absolute_url "> post.title </a></h2>  <!-- How does this absurl work?-->
    <p class="date">Published  post.publish  by  post.author </p> <!-- What does '.publish' print?-->
     post.body|truncatewords:30|linebreaks 
  % endfor %

  % include "pagination.html" with page=posts %
  <!-- The statement above is the little menu: "Page 1 of 2. Next" -->
  <!-- It also sends the 'page' variable as a GET parameter. -->

% endblock %

我的 pagination.html 文件:

<!-- This pagination template expects a paginator object. -->
<div class="pagination">

  <span class="step-links">
    % if page.has_previous %
      <a href="?page= page.previous_page_number ">Previous</a>
    % endif %


    <span class="current">
      Page  page.number  of  page.paginator.num_pages . <!-- what!? -->
    </span>

    % if page.has_next %
      <a href="?page= page.next_page_number ">Next</a>
    % endif %

  </span>
</div>

【问题讨论】:

这个问题对我来说没有意义。 “Django 怎么可能知道它不应该显示它应该显示的所有内容”这句话在逻辑上是不一致的。 已修复。非常感谢您的关注。 您正在捕获 PageNotAnInteger 异常,然后将 1 传递给 paginator.page 函数。然后你正在捕获一个 EmptyPage 异常,它看起来像正在使用默认/备用值。 为了更好地理解您的问题,您能否解释一下您到底对什么感到困惑?是不是不知道 Django 从哪里获取键值对来填充 request.GET 字典? 好的。我的问题是:如果“request.GET”是一个包含 GET 请求参数的字典,如果没有“page”参数,为什么我可以使用“page”作为“request.GET.get(“page”) 中的键在 GET 请求中? 【参考方案1】:

当请求中没有参数时(直接点击http://localhost:8000时),page的值为None。这是request.GET.get() 在找不到您要求的键时的默认行为 - 与普通 Python 字典相同(因为 GET 扩展了它)。

# page will be None
page = request.GET.get("page")

这意味着None 被传递给paginator.page()

try:
    # Passing None here
    posts = paginator.page(page)
except PageNotAnInteger:

这可能意味着(尽管我们看不到paginagor 的代码)引发了PageNotAnInteger 异常,因此将值1 传递给paginagor.page()

try:
    posts = paginator.page(page)  # Raises PageNotAnInteger because None passed
except PageNotAnInteger:
    # Posts are retrieved for page 1
    posts = paginator.page(1)

然后将来自上述调用的postspage 的值(仍然是None)传递给模板。

return render(request, "post/list.html", "page": page, "posts": posts);

模板list.html 然后迭代帖子并显示它们。

相当令人困惑的是,当包含pagination.html 模板时,它将一个名为page 的上下文变量定义为posts 的当前值:

<!-- Pass the value of posts using a variable name of page -->
% include "pagination.html" with page=posts %

所以pagination.html模板引用page的地方,其实就是使用posts的值。

<!-- Really posts.number and posts.paginator.num_pages -->
Page  page.number  of  page.paginator.num_pages 

希望这有助于解释事情。

另外一点,您不需要在 Python 中的每一行末尾添加分号。

【讨论】:

以上是关于“page” GET 参数从何而来?的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统启动过程的打印信息从何而来?

神经网络从何而来?

UnobservedTaskException - 任务从何而来

WAMP phpmyadmin 403 错误,不知从何而来?

0x 从何而来? [复制]

Cocoa - NSError 描述不知从何而来