1

我正在自学 Django,并且我正在尝试做一个测试,这样一个预先存在的用户会得到一个列出他或她的“东西”的页面,一个新用户会得到一个页面,通知他或她他们'不在系统中,可以生成用户列表。问题是我不断为不在预先存在的用户字典中的任何用户获取 KeyErrors(如果用户在字典中,它工作正常)。我不确定问题是出在我在views.py 中构建相关函数的方式上,还是出在我使用templateTags 的方式上,或者是什么。Django 的错误页面指向我的views.py 页面的上下文行,但我不知道这是否真的是问题所在。

任何帮助将不胜感激。

我的代码:

视图.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))

样本1.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 %}

最后:

网址.py:

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

2 回答 2

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 的代码示例。

于 2012-08-03T21:34:32.830 回答
1

而不是user_stuff[uname]使用user_stuff.get(uname). 如果uname键不存在,则值为None. 或者您可以使用user_stuff.get(uname, []),如果它不存在,它将使其成为一个空列表。

于 2012-08-03T21:36:19.973 回答