On 5月8日, 下午3時45分, Derek Dai <
derekda...@gmail.com> wrote:
> 阿蒙大:
>
> 我被一個奇怪的小問題卡住了,實在傷惱筋,想請求你的看法。
>
> 狀況描述:
> 我的models.py如下:
>
> class Thing(models.Model):
> name = models.CharField(blank=False, null=False, max_length=30)
> user = models.ForeignKey(User)
>
> 現在我的資料庫中,已經有21筆name的資料屬於user_id = 1的項下。想誠心求教的問題是,我想在view.py中寫出一個變數能直接代表
> 這19筆name資料,讓它在template顯示出,我的view.py如下:
>
> def downfile(request, user_id):
> user = get_object_or_404(User, pk=user_id)
> upfile = user.thing_set.filter(user=1)
> for p in upfile:
> name =
p.name
> render_to_response('demo.html', {'name':name})
你的 render_to_response 函式是在 for 迴圈中,語法是允許的,但邏輯上說不過去,因為在 for 迴圈的第一圈中,你的
render_to_response 已經執行,而整個 views.py 的程式也就結束了。
所以,在樣版如下的情況下:
{% for p in upfile %}
{{
p.name}}
{% endfor %}
你應該使用
def downfile(request, user_id):
user = get_object_or_404(User, pk=user_id)
upfile = user.thing_set.filter(user=1)
render_to_response('demo.html', {'upfile':upfile})
如果你實在很想用 {{ name }} 的話,你可以改用 {{ upfile|join:", " }} 來處理,利用樣版提供的 join 函式
來作後處理,但 class Thing 中要加入一行敘述:
def __str__(self): return
self.name
以上是我建議的方式。
那麼現在正式回答你的問題。你想要在樣版上設定 {{ name }} ,那麼在 views.py 中該如何撰寫呢?
def downfile(request, user_id):
user = get_object_or_404(User, pk=user_id)
upfile = user.thing_set.filter(user=1)
name = [
p.name for p in upfile]
# 上行也可改寫如下:
# name = []
# for p in upfile:
# name.append(
p.name)
# 此法效率輸給 [
p.name for p in upfile]
render_to_response('demo.html', {'name':name})
但我建議你不應該使用這種方法,因為 Django 強調 MTV ,所以在 V 當中,我們應該專注地處理變數,而變數值在網頁上會變成什麼樣,是
T 的問題。確實地,作好 MTV 的切割會有助於未來程式的維護及提供他人參與的機會。