通过URL传递对象数据

时间:2010-01-10 21:14:40

标签: django django-urls

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

(r'^edit/(?P<id>\w+)/', edit_entry),

可以像:

一样使用
def edit_entry(request, id):
        if request.method == 'POST':
                a=Entry.objects.get(pk=id)
                form = EntryForm(request.POST, instance=a)
                if form.is_valid():
                        form.save()
                        return HttpResponseRedirect('/contact/display/%s/' % id)
        else:
                a=Entry.objects.get(pk=id)
                form = EntryForm(instance=a)
        return render_to_response('edit_contact.html', {'form': form})

但是如何从网址中的模型字段(“id”除外)传递值?例如,我有一个抽象的基本模型,其字段为“job_number”,由子模型“OrderForm”和“SpecReport”共享。我想点击订单上的“job_number”,并为同一个工作号码调用规格报告。我可以创建一个

href="/../specifications/{{ record.job_number }}

将信息传递给url,但我已经知道这个正则表达式语法不正确:

(r'^specifications/(?P<**job_number**>\w+)/', display_specs),

我也无法以与id相同的方式捕获视图中的job_number:

def display_specs(request, job_number):
    records = SpecReport.objects.filter(pk=job_number)
    tpl = 'display.html'
    return render_to_response(tpl, {'records': records })

对此有一个简单的方法,还是比我想象的更复杂?

修改后的代码如下:

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

def display_specs(request, agencyID):
    agencyID= request.GET.get('agencyID')
    records = ProductionSpecs.objects.filter(pk=id)
    tpl = 'display_specs.html'
    return render_to_response(tpl, {'records': records })

不确定如何过滤。 pk不再适用。

3 个答案:

答案 0 :(得分:6)

是的,你让它变得有点复杂。

在你的urls.py中:

(r'^edit/(?P<id>\w+)/', edit_entry),

现在你只需要为display_specs添加几乎相同的表达式:

(r'^specifications/(?P<job_number>\w+)/', display_specs),

正则表达式中的括号标识组,(?P<name>...)定义命名组,其名称为name。此名称是视图的参数。

因此,您的视图现在看起来像:

def display_specs(request, job_number):
   ...

最后,即使这样可行,当您重定向到视图时,而不是使用:

HttpResponseRedirect('/path/to/view/%s/' % job_number)

使用更多DRY

HttpResponseRedirect(
    reverse('display_specs', kwargs={'job_number': a.job_number}))

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

为此,您需要在urlconf中开始使用named urls,如下所示:

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

答案 1 :(得分:1)

不知道你的模型结构是什么样的......为什么你不能只传递特定工作的id然后用查询来提取它?

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

尝试通过url传递job_number,特别是如果你不关心漂亮的url太多就这样做:

url:  /foo/bar/?job_number=12

没有特殊的标记来抓住这个顺便说一句,正则表达式是'r ^ ^ foo / bar /'

然后在视图中阅读:

job_number= request.GET.get('job_number')

答案 2 :(得分:0)

我真的不明白你的问题。在网址中传递id和传递job_number之间的区别是什么?如果你能做到一个,你为什么不能做另一个?一旦job_number在视图中,为什么你不能做一个普通的过滤器:

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