2010-01-10 102 views
2

我知道我可以通過URL模式傳遞對象值並在視圖函數中使用它們。例如:通過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}) 

但我怎麼在URL傳值從模型字段(不是「ID」等)?例如,我有一個抽象基本模型,其中有一個字段「job_number」,由子模型「OrderForm」和「SpecReport」共享。我想點擊訂單上的「工作編號」,併爲相同的工作編號調用規格報告。我可以創建一個

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

傳遞信息的url,但我已經知道,這正則表達式語法不正確:

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

我也不能捕捉在視圖中job_number以同樣的方式我可以一個ID:

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不再適用。

+0

我認爲你唯一剩下的問題是url正則表達式:)之後的所有問號(含)已去。這些被稱爲GET參數,不是匹配的東西的一部分。 – 2010-01-10 22:17:18

回答

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})) 

現在,如果你決定改變你的資源路徑,你的重定向將不會bre AK。

對於這個工作,你需要開始在你的URLconf使用named urls這樣的:

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

我先試了一下。但Django拋出404錯誤。如果「agencyID」是「EMP-INT-37914」並且URL被寫入(r'^ specdisplay /(?P \ w +)/',display_specs), - Django說:請求URL:\t http:// localhost :8000/specdisplay/EMP-INT-37914/ 嘗試了以下網址: ^ specdisplay// ... 這就是爲什麼我認爲你不能寫表達同樣的方式(P \ w +?)如。 – kjarsenal 2010-01-10 22:49:22

+0

確實,我不明白命名的團體以及我想要的(我正在研究它)。但似乎這個問題的癥結在於,這個語法「(?P​​\ w +)」僅當角度大括號內的數據是整數格式時才起作用?當我的機構id是字符串數據(因爲所有的都是)django拋出錯誤。我唯一能想到的與不同的是string vs integer。當我將「EMP-INT-37914」更改爲「5」時,它的功能就像一個魅力。不幸的是,它不能幫助我,因爲我的agencyID數據是字符串數據,我仍然無法弄清楚如何傳遞它。 – kjarsenal 2010-01-10 23:28:19

+0

模式'\ w'表示任何字母數字字符和下劃線,即[a-zA-Z0-9_]。請嘗試以下模式:/(?P [A-Z0-9 - ] +)/或可能(假設顯示規格始終以EMP-INT開頭)/(?P EMP-INT- \ d +)/ – 2010-01-10 23:47:48

1

不知道你的模型結構是什麼樣的......爲什麼你不能只傳遞特定工作的id,然後用查詢來提取它呢?

Afaik每個模型都會自動擁有一個id字段,該字段是自動增量的,並且是行的唯一標識符(如果您願意,則爲索引),因此只需將href創建更改爲{{record.id}}並從那裏開始。

嘗試傳遞job_number通過URL,然後,特別是如果你不關心漂亮的URL太多隻是這樣做:

url: /foo/bar/?job_number=12 

沒有特殊標記來BTW趕上這一點,正則表達式爲r'^富/酒吧/」

然後在這樣的觀點閱讀:

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

由於OrderForm對象的id不一定與SpecForm對象的id相同。如果我對每項工作都有訂單 - 但只有一些工作需要規格,我不認爲我能確定這些ID總是匹配。但工作數字總是會的。無論如何,這是我的邏輯。可能是錯的。我會嘗試一下id路由,看它是否有效。 – kjarsenal 2010-01-10 21:33:15

+0

,因爲我不能使這個評論足夠可讀,我已經編輯了答案,希望沒關係 – 2010-01-10 21:37:21

+0

感謝您的幫助。我試圖根據你的建議修改代碼。還不夠。你能快速看一下上面修改過的代碼,並告訴我我是否在正確的軌道上?謝謝。 另外 - 用「agencyID」替換「job_number」,因爲這是字段實際名稱。 – kjarsenal 2010-01-10 22:10:33

0

我真的不明白你的問題。在URL中傳遞id和傳遞job_number有什麼區別?如果你可以做一個,爲什麼你不能做另一個?而一旦job_number在視圖中,你爲什麼不能做一個正常的過濾器:

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

好的,所以我現在按這種方式過濾。謝謝。 – kjarsenal 2010-01-10 22:42:40

+0

如果job_number實際上不是代碼(比如「EMP-AS-15751」),那麼這似乎有所不同,這很不幸是很多企業識別其產品的方式。我不認爲這是我無法傳遞信息 - 只是我不認爲我可以使用與相同的正則表達式。 – kjarsenal 2010-01-10 23:32:53