2016-11-08 49 views
1

我有一個django應用程序'test_app'。 test_app頁面 - 「domain/test_app /」有一個到應用程序「基因」中另一個頁面的鏈接。這需要我「domain/test_app/genes /」。在這個頁面中,我有一個鏈接列表,它來自我的django數據庫中一個名爲「gene」的表格,它位於test_app/models.py中,類別爲Gene。這通過屬性'gene'鏈接到另一個名爲「Variants」的表作爲外鍵。Django的應用程序視圖 - 如何從URL中的django數據庫中獲取條目並從數據庫獲取更多信息以查看該視圖?

這是所有在test_app/models.py:

class Gene(models.Model): 
    gene = models.CharField(primary_key=True, max_length=110) 
    transcript = models.CharField(max_length=100) 

    def __str__(self): 
     return self.gene 


class Variant(models.Model): 
    variant = models.CharField(primary_key=True, max_length=210) 
    gene = models.ForeignKey(Gene, on_delete=models.CASCADE) 
    cds = models.CharField(max_length=150) 

    def __str__(self): 
     return self.variant 

我test_app/urls.py urlpatterns的是這樣的:

urlpatterns = [ 
    url(r'^$', views.test_app, name='test_app'), 
    url(r'^genes/$', views.genes, name='genes'), 
    url(r'^genes/(?P<gene>)', views.variant_info, name='variant_info'), 
] 

和test_app/views.py這個樣子(鏈接到我的模板中的test_app/templates/test_app /目錄中):

def test_app(request): 
    template = loader.get_template('test_app/index.html') 
    return render(request, 'test_app/index.html') 

def genes(request): 
    gene_list = Gene.objects.all() 
    context = {'gene_list': gene_list} 
    return render(request, 'test_app/genes.html', context) 

def variant_info(request, gene): 
    variant_info = Variant.objects.filter(gene=gene) 
    return(request, 'test_app/gene_info.html', {'variant_info': variant_info} 

我在我的基因表中有一個基因列表數據庫。當使用'gene_list = Gene.objects.all()'獲得這些基因時,這可以正常工作。然後,我將這個列表呈現爲模板,作爲我的「domain/test_app/genes」頁面上的一系列鏈接。例如,當我在此頁面上點擊TP53時,它會轉到「domain/test_app/genes/TP53 /」。這帶我到正確的頁面。

但是,我顯然沒有這個urlpattern正確的正則表達式,因爲當我輸入更多的數字或字符,如/ TP53098120918它仍然會進入同一頁面。即使當我把r'^基因/(?P)$'這仍然發生,我不明白爲什麼?

但我所面臨的主要問題是從我的數據庫中的變體表中獲取信息,並將其渲染到特定的基因頁面,如domain/test_app/genes/TP53。

當我點擊TP53它不經過我的看法功能「variant_info」爲基因的說法,因爲該行:

variant_info = Variant.objects.filter(gene=gene) 

不從數據庫獲取任何信息 - 我認爲這將通過基因=「TP53」當我點擊鏈接,因此這將是:

variant_info = Variant.objects.filter(gene='TP53') 

這將與基因TP53返回從變量表中的信息。我不知道如何從views.py中的基因功能正確訪問TP53。

+0

在urls.py中,您應該正確包含正則表達式,例如,如果您想通過id獲取基因: 'url(r'^ genes /(?P \ d +)',views.variant_info,name = 'variant_info'),' 這種方式將基因ID傳遞給視圖,那麼您應該以這種方式檢索變體對象:'variant_info = Variant.objects.filter(gene__id = gene)' – abidibo

+0

我沒有基因ID我的桌子。主要關鍵是基因名稱 – trouselife

+0

哦,我明白了。這是非常罕見的,無論哪種方式,定義字符匹配在reg exp中:'url(r'^ genes /(?P [^ /] +)',views.variant_info,name ='variant_info')'然後'variant_info = Variant.objects.filter(gene__gene = gene)' – abidibo

回答

0

爲你需要的東西的URL喜歡在年底

r'^genes/(?P<gene>TP\d+)$' 

只匹配數字(我想,否則會嘗試匹配的字符串,並只接受第一場比賽)

爲對於你的第二個問題:對不起,但我不明白你問的問題。 但看你的代碼,我想,你希望由外國型號的性能進行過濾:

variant_info = Variant.objects.filter(gene__gene__contains=gene) 

這意味着在目標基因的基因領域進行搜索。

ps。這開始看起來很奇怪,我建議改變模型,以類似

class Gene(models.Model): 
    name = models.CharField(primary_key=True, max_length=110) 
    ... 
+0

我想要的是當我點擊TP53時這個字符串「TP53」)通過我的urls正則表達式r'^ genes /(?P )'作爲,這樣就可以繼承我的view.py函數「variant_info」,這樣在test_app/genes/TP53頁面上它就會查詢我的數據庫中的Variant表使用參數gene =「TP53」,我可以將查詢結果呈現給這個頁面。 – trouselife

2

的問題是,你的(?P<gene>)沒有任何字符匹配,所以你將永遠有你的觀點gene=''

試着改變你的網址模式:

url(r'^genes/(?P<gene>\w+)/$', views.variant_info, name='variant_info'), 

這將接受字母A-Z,A-Z,數字0-9和下劃線的gene說法。爲了與您的其他觀點以及美元保持一致,我添加了斜線,因爲通常這是一個好主意。

相關問題