Django 通过URL传递对象数据

Django 通过URL传递对象数据,django,django-urls,Django,Django Urls,我知道我可以通过URL模式传递对象值,并在视图函数中使用它们。例如: (r'^edit/(?P<id>\w+)/', edit_entry), 但是如何从url中的模型字段(而不是“id”)传递值呢?例如,我有一个抽象的基本模型,它有一个字段“job_number”,由子模型“OrderForm”和“SpecReport”共享。我想点击订单上的“作业编号”,并调用同一作业编号的规范报告。我可以创建一个 href="/../specifications/{{ record.job_n

我知道我可以通过URL模式传递对象值,并在视图函数中使用它们。例如:

(r'^edit/(?P<id>\w+)/', edit_entry),
但是如何从url中的模型字段(而不是“id”)传递值呢?例如,我有一个抽象的基本模型,它有一个字段“job_number”,由子模型“OrderForm”和“SpecReport”共享。我想点击订单上的“作业编号”,并调用同一作业编号的规范报告。我可以创建一个

href="/../specifications/{{ record.job_number }}
将信息传递到url,但我已经知道此正则表达式语法不正确:

(r'^specifications/(?P<**job_number**>\w+)/', display_specs),
有没有一种简单的方法,或者比我想象的更复杂

经修订的守则如下:

(r'^specdisplay/?agencyID=12/', display_specs),
以及:


不知道如何过滤。pk不再适用。

不知道您的模型结构是什么样的。。。为什么你不能只传递特定作业的id,然后通过查询获取它

Afaik每个模型都自动有一个自动递增的id字段,它是一行的唯一标识符(如果您愿意,它是一个索引),所以只需将href创建更改为{{record.id}},然后从那里开始

然后尝试通过url传递作业号,特别是如果你不在乎漂亮的url,那么就这么做:

url:  /foo/bar/?job_number=12
顺便说一句,没有特殊的标记来捕捉这个,正则表达式是r'^foo/bar/'

然后像这样在视图中阅读:

job_number= request.GET.get('job_number')
url(r'^specifications/(?P<job_number>\w+)/', display_specs, name='display_specs'),

我真的不明白你的问题。在URL中传递
id
和传递
job\u number
有什么区别?如果你能做一个,为什么你不能做另一个?一旦作业编号出现在视图中,为什么不能进行常规筛选:

records = SpecReport.objects.filter(job_number=job_number)

是的,你让事情变得更复杂了

url.py中,您有:

(r'^edit/(?P<id>\w+)/', edit_entry),
最后,即使这会起作用,当您重定向到视图时,而不是使用:

HttpResponseRedirect('/path/to/view/%s/' % job_number)
使用更多:

现在,如果您决定更改资源路径,您的重定向将不会中断

要使其正常工作,您需要开始在urlconf中使用以下内容:

job_number= request.GET.get('job_number')
url(r'^specifications/(?P<job_number>\w+)/', display_specs, name='display_specs'),
url(r'^specifications/(?P\w+)/,display_specs,name='display_specs'),

因为OrderForm对象的id不一定与SpecForm对象的id相同。如果我对每项工作都有订单,但对某些工作只有规格表,我想我不能确定ID是否总是匹配。但就业人数永远不会减少。这就是我的逻辑。可能是错的。我将尝试id路由,看看它是否有效。因为我无法使此评论足够可读,我已编辑了答案,希望可以。谢谢您的帮助。我试图根据你的建议修改守则。还是不太好。你能看一下上面修改过的代码并告诉我我是否在正确的轨道上吗?谢谢另外-将“job_number”替换为“agencyID”,因为这是字段的实际名称。我认为您唯一剩下的问题是url regex:)问号(包括)之后的所有内容都必须删除。这些被称为GET参数,不属于匹配的内容。我首先尝试了这个。但是django抛出了一个404错误。如果“agencyID”为“EMP-INT-37914”,并且url已写入(r'^specdisplay/(?P尝试了以下url:^specdisplay/(?P\w+)/…这就是为什么我假设您不能以与相同的方式写入表达式。我确实不理解命名组,因为我正在处理它)。但似乎这个问题的症结在于,这种语法“(?P\w+”只在角括号内的数据为整数格式时才起作用?当我的AgencyID为字符串数据时(我所有的AgencyID都是字符串数据),django抛出了错误。我唯一能想到的是字符串与整数的不同。当我将“EMP-INT-37914”更改为“5”时,它像一个符咒一样工作。不幸的是,它对我没有帮助,因为我的agencyID数据是字符串数据,我仍然不知道如何传递它。模式“\w”表示任何字母数字字符和下划线,即[a-zA-Z0-9]。尝试此模式:/(?P[a-Z0-9-]+)/或者(假设显示规范总是以EMP-INT开头)/(?PEMP-INT-\d+)/如果job_number实际上不是一个数字,而是一个代码(如“EMP-as-15751”),这似乎有区别,不幸的是,这是许多企业识别其产品的方式。我不认为这是因为我无法传递信息——只是我认为我不能使用与之相同的正则表达式。
def display_specs(request, job_number):
   ...
HttpResponseRedirect('/path/to/view/%s/' % job_number)
HttpResponseRedirect(
    reverse('display_specs', kwargs={'job_number': a.job_number}))
url(r'^specifications/(?P<job_number>\w+)/', display_specs, name='display_specs'),