2016-11-08 1 views
1

J'ai une application django 'test_app'. La page test_app - "domain/test_app /" contient un lien vers une autre page de l'application "Genes". Cela m'amène à "domain/test_app/genes /". Dans cette page j'ai une liste de liens qui proviennent de ma table dans ma base de données django appelée "gene", qui est dans test_app/models.py comme classe Gene. Ce lien vers une autre table appelée "Variants" via l'attribut "gène" comme une clé étrangère.Vue de l'application Django - comment obtenir une entrée de la base de données django dans l'URL et obtenir plus d'informations de la base de données pour la vue?

C'est dans 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 

Mes test_app/urls.py urlpatterns ressembler à ceci:

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'), 
] 

et test_app/views.py ressembler à ceci (lien à test_app/templates/test_app/avec mes modèles dans):

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} 

J'ai une liste de gènes dans ma table de gène dans mon base de données. Lors de l'obtention de ces gènes en utilisant 'gene_list = Gene.objects.all()' cela fonctionne bien. Je rends ensuite cette liste à un modèle comme une série de liens sur ma page "domain/test_app/genes". Par exemple, lorsque je clique sur TP53 sur cette page, cela va à "domain/test_app/genes/TP53 /". Cela m'amène à la bonne page.

Cependant, je n'ai clairement pas la regex pour ce correctif comme correct quand je tape plus de chiffres ou de caractères tels que/TP53098120918 il va toujours à la même page. Même quand je mets des gènes '(^ P) $' ça se passe encore et je ne comprends pas pourquoi?

Mais le principal problème que j'ai est d'obtenir l'information de ma table de variantes dans ma base de données et de la rendre à la page de gène spécifique, comme domain/test_app/genes/TP53.

Quand je suis en cliquant sur le TP53 ne passe pas par ma fonction vue « variant_info » comme argument génétique parce que la ligne:

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

n'obtient aucune information de la base de données - Je pensais que ce passerait gène = « TP53 » quand je clique sur le lien, et donc ce serait:

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

qui renverrait les informations de la table variant avec le gène TP53 comme. Je ne sais pas comment accéder correctement au TP53 à partir de la fonction des gènes dans views.py.

+0

Dans urls.py, vous devez inclure correctement l'expression régulière, par exemple si vous souhaitez obtenir des gènes par ID: 'url (r '^ genes/(? P \ d +)', views.variant_info, name = 'variant_info'), ' de cette façon, l'identifiant du gène est transmis à la vue, alors vous devriez récupérer les objets variant de cette façon:' variant_info = Variant.objects.filter (gene__id = gene) ' – abidibo

+0

Je n'ai pas d'identifiant de gène dans ma table. La clé primaire est le nom du gène – trouselife

+0

oh, je vois. C'est assez rare, de toute façon, définir les caractères à correspondre dans l'exp reg: 'url (r '^ gènes/(? P [^ /] +)', views.variant_info, name = 'variant_info')' et puis 'variant_info = Variant.objects.filter (gene__gene = gène)' – abidibo

Répondre

0

pour l'URL que vous auriez besoin de quelque chose pour correspondre uniquement les chiffres à la fin

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

(je pense sinon il va essayer de correspondre à une chaîne et juste accepter le premier match)

comme pour votre deuxième question: désolé, mais je ne comprends pas ce que vous demandez. Mais en regardant votre code Je suppose que vous voulez filtrer les propriétés du modèle étranger:

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

Cela signifie pour la recherche dans le gène champ d'objet Gene.

ps.qui commence à paraître confus, je suggère de changer le modèle à quelque chose comme

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

Ce que je veux est quand je clique sur TP53 cette chaîne ("TP53") est passé à travers mes URLs regex r '^ genes/(? P )' comme de sorte que ceci est hérité dans ma fonction view.py "variant_info" de sorte que sur la page test_app/genes/TP53 il interroge la table Variant dans ma base de données en utilisant l'argument gene = "TP53" et je peux rendre les résultats de la requête à cette page. – trouselife

2

Le problème est que votre (?P<gene>) ne correspond pas à tous les caractères, de sorte que vous aurez toujours gene='' à votre avis.

Essayez de changer votre modèle d'URL pour:

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

Cela acceptera les lettres A-Z, a-z, des chiffres 0-9 et soulignent l'argument gene. J'ai ajouté le slash final pour la cohérence avec vos autres vues, et le dollar parce que c'est généralement une bonne idée de le faire.