排查Django表单/视图/模板及其协作方式

0 投票
2 回答
748 浏览
提问于 2025-04-17 13:04

我现在正在学习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 个回答

0

嗯,这里有几个问题。

首先,你的表单是由基础视图 homepageview 渲染的,并且提交回同一个网址。但是,处理表单的逻辑在一个单独的视图里,而这个视图并没有被调用。你可以把表单的 action 参数改成指向那个其他的网址,或者更好的是,把所有的逻辑都放到同一个视图里。

其次,你的表单处理视图没有返回任何响应或者渲染模板。这在 Django 中是个错误,如果你能调用到那个视图,你会看到一个异常。

第三,我很难相信你读过整个 Django 的书却没有看到关于模型或数据库的内容。这里没有任何迹象表明你设置了模型,但没有模型的话,Django 是无法往数据库里写东西的。你需要先设置模型,然后把你的表单改成 ModelForm 的子类,这样你就可以成功调用 form.save() 了。

2
  1. 在你的else语句中没有返回任何东西。一个视图必须总是返回一个响应,这个响应可以是任何东西,但大多数情况下你会返回一个HttpResponse的实例(我个人很喜欢使用render这个快捷方式)。在你的视图底部有一个默认的返回值是个好主意,另外可以为一些“特殊”的响应提前返回,其他情况下让执行到达默认返回值——这样你就不会出现什么都不返回的情况。

  2. 你必须使用模型来保存数据(你有没有看过这个教程?)。通常执行的流程是这样的:

    1. 你的应用接收到一个请求,然后在urls.py中查找应该调用的视图
    2. 请求会经过中间件
    3. 你的视图被调用并“做”一些事情。比如,它从数据库中获取数据(再次使用模型)或者把一些东西存储到数据库中(或者保存上传的文件、发送邮件等等——视图实际上可以做很多事情)
    4. 你的视图返回“某个东西”
    5. 返回的“某个东西”会经过中间件,最终会被转换成一串数据,传递给浏览器

就是这样。这是一个简化的描述,但基本上涵盖了所有重要的部分。

撰写回答