2013-07-15 36 views
0

我有兩個頁面分別顯示項目摘要和項目詳細信息。 像這樣url.py:django - 如何配置動態url

(r'^summary/$', 'views.summary'), 
(r'^summary_\d|[a-z]{24}$', 'views.itemInfo'), 

summary.html可以通過ID查詢項然後跳轉到summary_{{itemId}}.html顯示項目的詳細信息。 itemId是mongodb ObjectId,然後我使用正則表達式'\d|[a-z]{24}'。

summary.html模板我寫:

<form action="???" method="post"> 
    query Item by id: 
    <input type="text" name="itemId" value="" /><br /> 
    <input type="submit" value="query" /> 
</form> 

我的問題:

  1. 我應該寫什麼 '???'地點,要走的網址是動態形成的。

  2. 如何命名用於顯示項目信息的模板file(summary_{{itemId}}.html

回答

0

你在混合兩個重要的東西:URLs和數據傳遞方法(POST,GET等)。 HTTP並不是用來接收數據的,比如你打算使用它的URL和框架(比如Django)會對你有用,如果你堅持這樣的話。

您應該只有一個頁面,即/ summary /。它應該鏈接到一個視圖,該視圖檢查是否在POST數據中收到了itemId(如果保留了當前的HTML片段)。如果不是,只顯示查詢表單。否則,添加一個div元素,使用模板標籤或過濾器相應地顯示其數據。內置的iftemplate tag可能會有用。

作爲額外的好處,當輸入條目時您的搜索表單仍然可用,並且您將擁有更少的代碼來維護。

我建議切換到GET方法,這是爲了做你想做的。它將允許用戶在您的網站上添加書籤條目,以保留對該條目的引用,而不僅僅是搜索表單。

+0

只使用一個頁面,url.py將爲「(r'^ summary/$','views.summary'),(r'^ summary/$','views.query'),」第二個處理程序'views.query'將不會被調用。如何解決這個問題? – jean

+0

你應該只有一個視圖在你的情況。在這個視圖中,你可以在傳遞給你的視圖的HttpRequest參數的[querydict對象](https://docs.djangoproject.com/en/dev/ref/request-response/)上有一個條件語句。例如,沿着:「如果request.method =='POST'和request.POST和'itemId'在request.POST:」允許你將視圖分成兩部分。 – Soravux

1

第一修改網址從URL抓取id

(r'^summary/(?P<id>\d|[a-z]{24})/$', 'views.itemInfo', name="item_info"), 

把同樣的總結URL形式的行動

action="{% url 'views.summary' %}" 

在摘要視圖檢查,如果請求則POST請求搶如果請求是GET或者沒有id發現在POST再次顯示摘要視圖:

def summary(request): 
    if request.method == 'POST': 
     id = request.POST.get('itemId') 
     if id: 
      return redirect(reverse('item_info', kwargs={'id': id})) 
    return render_to_response(
     'summary.html', {}, context_instance=RequestContext(request)) 

詳細視圖應該通過id查詢項目並在上下文中傳遞項目。你剛纔命名模板作爲item_detail.html並通過對象實例使用單模板來顯示不同的內容:

def itemInfo(request, id): 
    item = MyItemModel.objects.get(id=id) 
    return render_to_response(
     'item_detail.html', {'item': item}, context_instance=RequestContext(request)) 

現在用itemitem_detail.html玩。

希望這可以幫助你。請照顧你的自我imports