2012-08-03 73 views
1

我在教自己的Django,我試圖做一個測試的事情,這樣一個預先存在的用戶將得到一個頁面列出他或她的「東西」,一個新用戶會得到一個通知他或她不在系統中的頁面,並且可以生成用戶列表。問題是我不斷獲取不在預先存在的用戶字典中的任何用戶的KeyErrors(如果用戶在字典中,它可以正常工作)。我不確定問題出在我在views.py中構建相關函數的方式,還是以我使用templateTags或其他方式的方式構建的。 Django的錯誤頁面指向了我的views.py頁面的上下文行,但我不知道這實際上是否是問題所在。Django KeyError {%if%}

任何幫助將不勝感激。

我的代碼:

views.py:

def hiUser(request,uname): 
    t = get_template("samplate1.html") 
    ds,ti = getTime() 
    user_stuff = {"sam":["a","b","c"],"kathy":["foo","bar"],"rob":[]} 
    c = Context({"date":ds,"time":ti,"user":uname,"user_stuff":user_stuff[uname],"users":user_stuff.keys()}) 
    return HttpResponse(t.render(c)) 

samplate1.html:

<html> 
{% ifequal user "list" %} 
<head><title>List of Users</title></head> 
<body><h1>List of users</h1> 
<ul> 
{% for user in users %} 
    <li>{{ user }}</li> 
{% empty %} 
    <p>No users listed!</p> 
{% endfor %} 
</ul> 
{% endifequal %} 
{% if user in users %} 
<head><title>Greetings, {{ user }}</title></head> 
<body> 
<h1>Hello</h1> 
<p>Greetings, {{ user }}</p> 
<p>The date is {{ date }}</p> 
<p>The time is {{ time }}</p> 
<p>Here is a list of your stuff:</p> 
<ul> 
    {% for item in user_stuff %} 
     <li>{{ item }}</li> 
    {% empty %} 
     <p>You don't have any stuff!</p>  
    {% endfor %} 
    </ul> 
{% else %} 
<head><title>You're new here, huh?</title></head> 
<body> 
<h1>Hello</h1> 
<p>Your username is not in our database.</p> 
<p>You should probably fix that.</p> 
{% endif %} 

最後:

urls.py:

... 
urlpatterns = ('', 
    (r'^user/name/(.*)/$',hiUser), 
) 

回答

1

而不是user_stuff[uname]使用user_stuff.get(uname)。如果uname鍵不存在,則該值將是None。或者你可以使用user_stuff.get(uname, []),如果它不存在,這將使它成爲一個空列表。

+0

解決!謝謝。 – swizzard 2012-08-04 16:08:43

1

問題是與你的views.py - 這一部分,具體如下:

c = Context({"date":ds,"time":ti,"user":uname,"user_stuff":user_stuff[uname],"users":user_stuff.keys()}) 

爲了解決這個問題,你需要弄清楚你要怎麼做,如果用戶不在user_stuff什麼。你打算提出一個404?顯示錯誤?填寫虛擬內容?

如果你想提高一個404,你可以做這樣的:

from django.http import Http404 

def hiUser(request,uname): 
    t = get_template("samplate1.html") 
    ds,ti = getTime() 
    user_stuff = {"sam":["a","b","c"],"kathy":["foo","bar"],"rob":[]} 

    if uname not in user_stuff: 
     raise Http404 

    c = Context({"date":ds,"time":ti,"user":uname,"user_stuff":user_stuff[uname],"users":user_stuff.keys()}) 
    return HttpResponse(t.render(c)) 

如果你要填寫假的內容,你可以使用dict.get,像這樣:

def hiUser(request,uname): 
    t = get_template("samplate1.html") 
    ds,ti = getTime() 
    user_stuff = {"sam":["a","b","c"],"kathy":["foo","bar"],"rob":[]} 

    stuff_for_user = user_stuff.get(uaname, []) 
    c = Context({"date":ds,"time":ti,"user":uname,"user_stuff":stuff_for_user,"users":user_stuff.keys()}) 

    return HttpResponse(t.render(c)) 

如果要顯示錯誤頁面,則需要修改引發404的代碼示例。

+1

很好的答案,但我認爲你正在重裝OPs壓痕問題 – jdi 2012-08-03 21:35:21

+0

我確實 - 謝謝你的提升。編輯。 – girasquid 2012-08-03 21:35:48