2016-11-08 13 views
1

私はdjangoアプリケーション 'test_app'を持っています。 test_appページ - "domain/test_app /"には、アプリ "Genes"内の別のページへのリンクがあります。これは私を "domain/test_app/genes /"に連れて行きます。このページでは、私のdjangoデータベースの "gene"と呼ばれるテーブルのリンクのリストがあります。これはtest_app/models.pyというクラスGeneです。これは、外部キーとして属性「遺伝子」を介して「バリアント」と呼ばれる別のテーブルにリンクします。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 /」に移動します。これは正しいページに私を連れて行きます。

しかし、私は明らかに、このURLパターンの正規表現は、/ TP53098120918のように多くの桁や文字を入力したときと同じように正しいページにはなりません。私がr '^ genes /(?P)$を置いたとしても、これはまだ起こっているのですが、なぜそれほど理解できませんか?

しかし私が抱えている主な問題は、自分のデータベースのバリアントテーブルから情報を得て、これをdomain/test_app/genes/TP53などの特定の遺伝子ページにレンダリングすることです。

私はラインので、それは遺伝子の引数としての私のビュー関数の「variant_info」を通らないTP53をクリックしています:

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

は、データベースから情報を取得しません - 私はこれを考えました遺伝子を渡す=「TP53」私は、リンクをクリックして、そのためこれは次のようになりとき:TP53のような遺伝子に変異型テーブルから情報を返します

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

を。私は、views.pyの遺伝子機能からTP53に正しくアクセスする方法を知らない。

としてあなたが最後

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

(私はそれ以外の場合は、文字列に一致するようにしようとすると、ちょうど最初の試合を受け入れると思う)

で数字だけを一致させるようなものを必要とするだろうURLの

+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

あなたの2番目の質問:申し訳ありませんが、私はあなたが求めているものを得ることはありません。 しかし、あなたのコードを見て、私はあなたが外国人モデルの特性によってフィルタリングすると仮定します。

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

これは、オブジェクトの遺伝子の分野遺伝子で検索することを意味します。

ps。それは混乱して見え始める、私はこの問題は、あなたの(?P<gene>)は、任意の文字を一致していないので、あなたは常にあなたのビューでgene=''を持っているということです

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

TP53をクリックすると、 "TP53")は私のURL regex r '^ genes /(?P )'にとして渡されるので、view.py関数 "variant_info"に継承され、test_app/genes/TP53ページで照会されます引数gene = "TP53"を使用している私のデータベースのVariantテーブルと私はこのページにクエリ結果を表示できます。 – trouselife

2

のようなものにモデルを変更することを示唆しています。手紙-Z、-Z、0〜9の数字を受け入れ、gene引数にアンダーます

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

この:

はあなたにURLパターンを変更してみてください。私はあなたの他のビューとの一貫性のために後続のスラッシュを追加しました。これは通常、これを行うことをお勧めします。

関連する問題