排查Django表单/视图/模板及其协作方式
我现在正在学习Django,读了大部分书,想自己写一个网页应用。但我就是搞不清楚这些部分是怎么互动的,感觉它们不太能结合在一起。
我的urls.py文件是这样的……
from django.conf.urls.defaults import patterns, include, url
from users.views import homepageview, submitted, referral_create
urlpatterns = patterns('',
(r'^$', homepageview),
(r'^submitted/$', referral_create),
views.py文件看起来是这样的……
# Create your views here.
from django.shortcuts import render_to_response
from django import forms
from datreferral.users.forms import ReferralCode
def homepageview(request):
now = 'your damn referral code'
return render_to_response('datreferraltemplate.html', {'now': now})
def referral_create(request):
if request.method == 'POST':
form = ReferralCode(request.POST)
if form.is_valid():
new_code = form.save()
return HttpResponseRedirect(reverse(contact_details, args=(new_contact.pk,)))
else:
form = ReferralCode()
form.py文件是这样的……
from django import forms
class ReferralCode(forms.Form):
referralcode = forms.CharField()
而模板看起来是这样的……
{% extends "base.html" %}
{% block title %}
Enter your referral codes!
{% endblock %}
{% block content %}
<h1>Enter your code</h1>
{% if errors %}
<ul>
{% for error in errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
<form action="" method="POST">
<p>Subject: <input type="text" name="subject" value="{{ referralcode }}"></p>
<input type="submit" value="Submit">
</form>
{% endblock %}
希望这些信息足够了。
我有两个问题。首先,当我提交表单后想查看页面时,结果却没有任何反应,因为我猜“if request.method == 'POST':”这个条件没有被触发。显然,这个问题应该很明显,但我现在就是找不到bug。
第二个问题其实是求助。经过多次阅读那些章节,我还是搞不清楚所有部分是如何相互作用的。我知道模板、urls.py和views.py是有联系的,我大概明白,但我真的不太明白数据库和表单是怎么和视图/模板互动的。比如说,我只想要一个简单的表单,把用户输入的内容写入数据库……该怎么做呢?我用的是Postgres,如果这有影响的话。
注意:模板中的表单和代码是我在这里找到的修改版,我试着调整以满足我的需求,但失败了,所以如果这部分不太明白也不要太惊讶,因为我还没能深入处理这部分,都是因为这些问题。
作为一个新手,我非常感谢任何愿意帮助我或指引我方向的人。
2 个回答
嗯,这里有几个问题。
首先,你的表单是由基础视图 homepageview
渲染的,并且提交回同一个网址。但是,处理表单的逻辑在一个单独的视图里,而这个视图并没有被调用。你可以把表单的 action
参数改成指向那个其他的网址,或者更好的是,把所有的逻辑都放到同一个视图里。
其次,你的表单处理视图没有返回任何响应或者渲染模板。这在 Django 中是个错误,如果你能调用到那个视图,你会看到一个异常。
第三,我很难相信你读过整个 Django 的书却没有看到关于模型或数据库的内容。这里没有任何迹象表明你设置了模型,但没有模型的话,Django 是无法往数据库里写东西的。你需要先设置模型,然后把你的表单改成 ModelForm 的子类,这样你就可以成功调用 form.save()
了。
在你的else语句中没有返回任何东西。一个视图必须总是返回一个响应,这个响应可以是任何东西,但大多数情况下你会返回一个
HttpResponse
的实例(我个人很喜欢使用render
这个快捷方式)。在你的视图底部有一个默认的返回值是个好主意,另外可以为一些“特殊”的响应提前返回,其他情况下让执行到达默认返回值——这样你就不会出现什么都不返回的情况。你必须使用模型来保存数据(你有没有看过这个教程?)。通常执行的流程是这样的:
- 你的应用接收到一个请求,然后在urls.py中查找应该调用的视图
- 请求会经过中间件
- 你的视图被调用并“做”一些事情。比如,它从数据库中获取数据(再次使用模型)或者把一些东西存储到数据库中(或者保存上传的文件、发送邮件等等——视图实际上可以做很多事情)
- 你的视图返回“某个东西”
- 返回的“某个东西”会经过中间件,最终会被转换成一串数据,传递给浏览器
就是这样。这是一个简化的描述,但基本上涵盖了所有重要的部分。