首先,我爲無關緊要的問題表示歉意。我對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
如何計算搜索ID?它在我看來有點像你把馬車放在馬前 - 你是否在渲染你的'search.html'模板時知道搜索ID? – 2014-12-04 18:04:12
對象u在視圖中創建,並且可以通過u.id訪問id(autoincremented)。我用一個例子對它進行了測試。這是否回答你的問題? – Sarah 2014-12-04 21:54:16
好的 - 您的觀點與通常的做法有所不同。我將在答案中展示標準方法。 – 2014-12-04 21:58:57