如何在Django文件中包含表单?

Dan*_*rst 2 python mysql django

我有一个在mysite/new_player.html中创建的表单.它接受3个字段,user_name,real_name和site_played,它们对应于数据库中的Player表.

<h1> New Player </h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="/stakeme/new/" method="post">
{% csrf_token %}
User Name: <input type="text" name="user_name" id="user_name"/><br>
Real Name: <input type="text" name="real_name" id="real_name"/><br>
Site Played: <input type="text" name="site_played" id="site_played"/><br><br>
<input type="submit" value="New Player" />
</form>
Run Code Online (Sandbox Code Playgroud)

我被困在如何将其添加到我的mysite/views.py文件中.我已经完成了民意调查教程,但是教程中使用的唯一形式是"民意调查"的多项选择"选择",我似乎无法将其改编为文本字段.

def new_player(request):
    return render_to_response('stakeme/new_player.html',
                           context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

据我所知,我需要创建类似的东西def add(request): return render_to_response('stakeme/new/'.. etc并在这里添加POST数据,但这就是我迷失的地方.我不知道如何将数据导入数据库.

我正在阅读Django文档,但我觉得我只是复合了一些我不理解的东西.如果有人能指出我正确的方向,我会非常感激.

Cas*_*par 6

首先,您不需要定义新视图来处理表单数据.此外,您正在使用HTML直接创建表单 - 可以这样工作(请参阅后面的部分),但使用Django Forms库会更好(更容易).

使用Django表单

从开始到包括"使用模板显示表单" 的文档(v1.3表单文档)解释了使用表单库的基础知识,因此我将从那里进行自由复制和粘贴.我还假设您熟悉基本的python构造并安装了Django 1.3.不用多说,这是我的adhoc表单教程.

开始一个新的django项目:

$ django.admin.py startproject mysite
Run Code Online (Sandbox Code Playgroud)

添加新应用:

$ ./mysite/manage.py startapp myapp
Run Code Online (Sandbox Code Playgroud)

让我们创建我们的联系表单(从Django表单doc中的示例修改).在myapp/名为called 的目录旁边创建一个文件,forms.py并将以下内容放入其中:

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

接下来,由于您提到将收到的联系表单中的数据存储在数据库中,我们将添加一个模型Feedback,以跟踪收到的联系表单.在您的models.py文件中,添加以下内容:

class Feedback(models.Model):
    subject = models.CharField(max_length=100)
    message = models.TextField()
    sender = models.CharField(max_length=100)

    def __unicode__(self):
        return "Subject:{subject}\nSender:{sender}\n{msg}".format(subject=self.subject,
                                                                sender=self.sender,
                                                                msg=self.message)
Run Code Online (Sandbox Code Playgroud)

(您可能会注意到这与我们之前定义的形式非常相似;通常在这样的场景中,可以使用Django模型表单直接从模型创建表单,但我们正在手工构建表单作为学习体验)

我们还需要让Django在我们的数据库中为这个反馈模型创建所需的表,因此在settings.py插入的顶部有以下有用的代码:

import os
PROJECT_DIR = os.path.dirname(__file__)
Run Code Online (Sandbox Code Playgroud)

并将DATABASES设置更改为settings.py以下内容以使用sqlite数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': os.path.join(PROJECT_DIR, "sqlite.db").replace('\\', '/'),   # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,将INSTALLED_APPS设置更改为以下内容,以将我们最近创建的应用程序包含myapp在已安装的应用程序列表中mysite:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)
Run Code Online (Sandbox Code Playgroud)

现在运行syncdb命令让Django在你的sqlite数据库中创建表(因为它是sqlite,如果它还不存在,它将被创建):

$ ./mysite/manage.py syncdb
Run Code Online (Sandbox Code Playgroud)

(Django也会提示你创建一个超级用户:你现在不需要创建一个超级用户,因为我们不需要它,你可以django-admin.py createsuperuser在需要的时候创建一个超级用户,但如果你愿意的话,现在可以立即创建)

现在我们需要一个视图来显示联系表单,以及一个感谢人们提交它的视图.在您的views.py文件中,添加以下内容(稍微修改一下Django表单文档):

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
from myapp.forms import ContactForm
from myapp.models import Feedback

def thanks(request):
    return render_to_response('thanks.html')

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']
            sender = form.cleaned_data['sender']

            feedback = Feedback(subject=subject, message=message, sender=sender)
            feedback.save()

            return HttpResponseRedirect(reverse('thanks')) # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    }, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

现在我们需要将URL映射到视图.打开mysite/urls.py并使其看起来如下所示

from django.conf.urls.defaults import patterns, include, url

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    url(r'^thanks/$', 'myapp.views.thanks', name='thanks'),
    url(r'^$', 'myapp.views.contact', name='contact'),
    # url(r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # url(r'^admin/', include(admin.site.urls)),
)
Run Code Online (Sandbox Code Playgroud)

现在我们需要一些模板来显示联系表单和thankyou页面.创建一个目录mysite/templates/,在其中创建一个文件contact.html,并在其中加入以下内容:

<html>
    <head>
        <title>Contact Us</title>
    </head>
    <body>
        <p>Please fill out the following information and click submit:</p>

        <form action="{% url contact %}" method="post">{% csrf_token %}
            {{ form.as_p }}
            <input type="submit" value="Submit" />
        </form>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

还要thanks.html为感谢页面创建一个页面,并在其中添加以下内容:

<html>
    <head>
        <title>Thanks</title>
    </head>
    <body>
        <p>Thank you. Your feedback is important to us</p>

        <p>Please leave some more feedback at the <a href="{% url contact %}">Contact page</a></p>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

接下来,我们需要确保Django可以找到我们的模板,因此将TEMPLATE_DIRSin mysite/settings.py设置修改为以下内容:

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(PROJECT_DIR, "templates").replace('\\', '/'),
)
Run Code Online (Sandbox Code Playgroud)

现在,(终于!),您可以运行调试服务器并测试一切是否正常:

$ ./mysite/manage.py runserver 8080
Run Code Online (Sandbox Code Playgroud)

转到http:// localhost:8080 /并尝试输入一些反馈.单击"提交"时,应将输入的详细信息放入数据库并显示"感谢"页面.您可以查看输入数据库的详细信息:

$ ./mysite/manage.py shell
Run Code Online (Sandbox Code Playgroud)

进入shell,输入:

>>> from myapp.models import Feedback
>>> for f in Feedback.objects.all(): print f
Run Code Online (Sandbox Code Playgroud)

(注意输入最后一行后需要按两次输入)

您应该看到您创建的反馈条目.

在HTML中手动创建表单

如果您坚持这样做,您可以使用request.POST字典直接在视图中访问表单的请求变量,然后手动实例化对象模型并调用save(如contact()上面的视图函数中所示).

我不建议这样做,因为你失去了Django Forms提供的一大堆很好的功能(CSRF保护,验证等).

其他教程

由于这个问题的原始形式要求一些教程:官方Django wiki有一个列出一些教程页面,其中一些涉及表单.请注意,很多教程都很老(主要是2007-2009).