我正在阅读Django教程,在教程中,urls.py是这样的:
(r'^vote/$', bookmark_vote_page),
并且有一个名为'SharedBookmark'的模型:
class SharedBookmark(models.Model):
bookmark = models.ForeignKey(Bookmark, unique=True)
但在模板中,导致/ vote /的链接是:
{% if shared_bookmarks %}
<ul class="bookmarks">
{% for shared_bookmark in shared_bookmarks %}
<li>
<a href="/vote/?id={{ shared_bookmark.id }}" class="vote">[+]</a>
正如你在行中看到的那样:
<a href="/vote/?id={{ shared_bookmark.id }}" class="vote">[+]</a>
该链接不仅仅是去/投票/,它进入/投票/有'?id = x',其中x是数字。
处理链接的视图是:
def bookmark_vote_page(request):
if request.GET.has_key('id'):
try:
id = request.GET['id']
我的问题是,'id = x'到底是做什么的?因为它不会更改URL(当我点击链接时,它仍然会进入/ vote /)。
我试过google'ing但我看到的所有解释都解释了什么?P =但不是什么?id = do。我记得看到一个django文档解释了它,但由于某种原因我找不到文档的链接。
答案 0 :(得分:4)
Sam解释了如何将URL放在一起。继续那里......
在Django中,查询字符串被转换为类似字典的对象。由于请求是GET
请求(将查询参数放入URL而不是请求主体的类型),因此这个类似字典的对象存储在request.GET
。所以当视图执行这一行时:
if request.GET.has_key('id'):
它检查URL是否有一个名为&#34; id&#34;的查询字符串参数。一点都不一旦确定,它就会继续:
id = request.GET['id']
顺便说一下,建议(主要是为了可读性)来检查查询参数的存在,如下所示:
if 'id' in request.GET:
答案 1 :(得分:2)
?
开始query string。查询字符串是以下形式的参数列表:
?name1=value1&name2=value2&name3=value3
这是传递数据以修改GET请求的简便方法。
在大多数HTTP请求中,例如POST / PUT / DELETE /等,您可以将数据与请求一起发送。在GET请求中,您应该只询问某个URL的内容。但有时候,您希望请求一个URL,但会收到稍微修改过的内容。考虑搜索或查询参数:
GET /search?q=example
GET /search?q=example&p=2
GET /search?q=new%20word
我最后的注释更适用于RESTful API的设计。我说你可以在GET请求中使用查询字符串“传递数据”,但是根据你传递的数据类型,这可能是糟糕的设计。通常,查询参数应该执行以下操作:
这包括用于过滤一组结果的?q=example
,用于排序结果的?sort=alphanumeric
和用于修改响应类型的?return=json
。如果您要将数据发送到修改数据库,则可能不应该使用GET请求。例如,注册应该使用POST请求(因为它正在创建一些东西),修改用户的设置应该使用PUT请求(因为它正在更新某些东西)。