2014-12-04 64 views
0

首先,我爲無關緊要的問題表示歉意。我對Django很陌生,我確信我錯過了一些明顯的東西。我在這裏閱讀了許多其他帖子,一直沒能找到我做錯的任何明顯事情。非常感謝您的幫助,我現在處於最後期限之內。Django - 將一個視圖中的變量傳遞給模板中的url標記

我在Python 2.7中使用Django 1.6。我有一個名爲dbquery的應用程序,它使用表單從用戶獲取數據並查詢REST服務。然後我嘗試在結果頁面上顯示結果。 顯然還有更多要補充的,這只是一個非常簡單的開始。

問題是,我似乎無法從我的搜索視圖中正確地獲取模板中的url標記的autoincremented id字段。如果我把數字1寫入像這樣{% url 'dbquery:results' search_id=1 %},頁面加載並運行良好,但我似乎無法獲得正確的變量名稱,並且django文檔沒有幫助 - 也許這對大多數人來說是顯而易見的。我得到一個反向錯誤,因爲變量總是空的,所以它不能匹配我的urls.py中的結果正則表達式。我測試了我的代碼在命令行shell中添加一個對象,它似乎工作。我的視圖中返回render()語句有問題嗎?

urls.py

from django.conf.urls import patterns, url 
from dbquery import views 

urlpatterns = patterns('', 

    # ex: /search/ 
    url(r'^$', views.search, name='search'), 

    # ex: /search/29/results/ --shows response from the search 
    url(r'^(?P<search_id>\d+)/results/', views.results, name ='results'), 
) 

models.py

from django.db import models 
from django import forms 
from django.forms import ModelForm 
import datetime 

# response data from queries for miRNA accession numbers or gene ids 
class TarBase(models.Model): 
    #--------------miRNA response data---------- 
    miRNA_name = models.CharField('miRNA Accession number', max_length=100) 
    species = models.CharField(max_length=100, null=True, blank=True) 
    ver_method = models.CharField('verification method', max_length=100, null=True, blank=True) 
    reg_type = models.CharField('regulation type', max_length=100, null=True, blank=True) 
    val_type = models.CharField('validation type', max_length=100, null=True, blank=True) 
    source = models.CharField(max_length=100, null=True, blank=True) 
    pub_year = models.DateTimeField('publication year', null=True, blank=True) 
    predict_score = models.DecimalField('prediction score', max_digits=3, decimal_places=1, null=True, blank=True) 
    #gene name 
    gene_target = models.CharField('gene target name',max_length=100, null=True, blank=True) 
    #ENSEMBL id 
    gene_id = models.CharField('gene id', max_length=100, null=True, blank=True) 
    citation = models.CharField(max_length=500, null=True, blank=True) 

    def __unicode__(self): 
     return unicode(str(self.id) + ": " + self.miRNA_name) or 'no objects found!' 

views.py

from django.shortcuts import render, get_object_or_404 
from django.http import HttpResponse, Http404, HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from dbquery.models import TarBase, SearchMainForm 
from tarbase_request import TarBaseRequest 

#main user /search/ form view 
def search(request): 
    if request.method == 'POST': #the form has been submitted 
     form = SearchMainForm(request.POST) #bound form 
     if form.is_valid(): #validations have passed 
      miRNA = form.cleaned_data['miRNA_name'] 

      u = TarBase.objects.create(miRNA_name=miRNA) 

      #REST query will go here. 

      #commit to database 
      u.save() 

      return render(request,'dbquery/results.html', {'id':u.id}) 

    else: #create an unbound instance of the form 
     form = SearchMainForm(initial={'miRNA_name':'hsa-let-7a-5p'}) 
    #render the form according to the template, context = form 
    return render(request, 'dbquery/search.html', {'form':form}) 


#display results page: /search/<search_id>/results/ from requested search 
def results(request, search_id): 
    query = get_object_or_404(TarBase, pk=search_id) 
    return render(request, 'dbquery/results.html', {'query':query}) 

模板: search.html

<html> 
<head><h1>Enter a TarBase Accession Number</h1> 
</head> 
<body> 
<!--form action specifies the next page to load--> 
<form action="{% url 'dbquery:results' search_id=1 %}" method="post"> 
{% csrf_token %} 
{{ form.as_p }} 
<input type="submit" value="Search" /> 
</form> 

</body> 

results.html

<html> 
<head><h1>Here are your results</h1> 
</head> 
<body> 
{{query}} 

</body 
+0

如何計算搜索ID?它在我看來有點像你把馬車放在馬前 - 你是否在渲染你的'search.html'模板時知道搜索ID? – 2014-12-04 18:04:12

+0

對象u在視圖中創建,並且可以通過u.id訪問id(autoincremented)。我用一個例子對它進行了測試。這是否回答你的問題? – Sarah 2014-12-04 21:54:16

+0

好的 - 您的觀點與通常的做法有所不同。我將在答案中展示標準方法。 – 2014-12-04 21:58:57

回答

1

直到您提交表單後,纔會創建搜索結果並且沒有ID。通常的方式做,這將有你的形式使用自己的URL作爲動作,然後有觀點重定向到結果視圖後,成功節省:

from django.shortcuts import redirect 

def search(request): 
    if request.method == 'POST': #the form has been submitted 
     form = SearchMainForm(request.POST) #bound form 
     if form.is_valid(): #validations have passed 
      miRNA = form.cleaned_data['miRNA_name'] 
      u = TarBase.objects.create(miRNA_name=miRNA) 
      #REST query will go here. 

      #commit to database 
      u.save() 

      return redirect('results', search_id=u.id) 

    else: #create an unbound instance of the form 
     form = SearchMainForm(initial={'miRNA_name':'hsa-let-7a-5p'}) 
    #render the form according to the template, context = form 
    return render(request, 'dbquery/search.html', {'form':form}) 

然後在你的模板:

<form action="" method="post"> 

這會導致您的表單將其數據提交到search視圖進行驗證。如果表單有效,視圖會保存結果,然後根據保存後確定的ID重定向到適當的結果頁面。

+0

彼得,非常感謝。我不知道爲什麼這個概念對我來說非常棘手。我喜歡你,但我還沒有名聲。當我回到常規機器並完成答案時,我會對此進行測試。 – Sarah 2014-12-04 22:07:24

+0

如果這對你有效,如果你喜歡,你可以接受這裏描述的答案:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work這不需要任何最低的聲譽。 – 2014-12-04 23:01:48

+0

謝謝,它似乎我已經能夠接受答案,只是沒有upvote呢。良好的鏈接,但。 – Sarah 2014-12-05 03:27:56

0

在這種情況下,你可能最好通過你的搜索參數作爲參數,如http://host/results?search_id=<your search value>

這將允許您指定您的網址爲url(r'results/', views.results, name ='results')並在您的模板中引用爲{% url dbquery:results %}

那麼在你看來,你將其更改爲:

def results(request): 
    search_id = request.POST.get('search_id') 
    query = get_object_or_404(TarBase, pk=search_id) 
    return render(request, 'dbquery/results.html', {'query':query}) 

或者,如果你想查詢到實際的URL顯示,改變形式是method="get"request.POST.get('search_id')request.GET.get('search_id')

+0

第一個想法似乎是明智的建議,但我希望能夠具有頁面/搜索/ 1 /,例如,顯示搜索的詳細信息,以便用戶可以返回到該頁面。 Django的原則不是創建這樣的乾淨網址嗎?並且爲了澄清,在第二部分中,您說要對我的search.html模板進行這些更改?對不起,如果這是一個愚蠢的問題,我只是在很短的時間內吸收了這麼多的信息。 – Sarah 2014-12-04 21:57:25

+0

是的,在第二部分中,它指的是如何修改HTML模板中的內容。你說得對,我在這裏解釋的不像像/ search/1那樣乾淨,但它仍然允許用戶回到它。也就是說,彼得的解決方案比我在這裏要乾淨得多。 – Jared 2014-12-05 04:21:00

+1

我很欣賞替代視圖和其他選項,因爲我仍處於學習過程中。 – Sarah 2014-12-06 18:07:56

相關問題