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

时间:2012-01-18 01:33:22

标签: 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>

我被困在如何将其添加到我的mysite / views.py文件中。我已经完成了民意调查教程,但本教程中使用的唯一表单是“民意调查”的多项选择“选择”,我似乎无法适应文本字段。

def new_player(request):
    return render_to_response('stakeme/new_player.html',
                           context_instance=RequestContext(request))

据我了解,我需要创建类似def add(request): return render_to_response('stakeme/new/'.. etc的内容并在此处添加POST数据,但这就是我丢失的地方。我不知道如何将数据导入数据库。

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

3 个答案:

答案 0 :(得分:6)

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

使用Django表单

从一开始到包括“使用模板显示表单”的文档(v1.3 forms documentation)解释了使用表单库的基础知识,因此我将复制&amp;从那里开始粘贴。我还假设你熟悉基本的python构造和amp;已安装Django 1.3。不用多说,这是我的adhoc表格教程。

启动一个新的django项目:

$ django.admin.py startproject mysite

添加新应用:

$ ./mysite/manage.py startapp myapp

让我们创建我们的联系表单(从Django表单doc中的示例修改)。在名为myapp/的{​​{1}}目录旁边创建一个文件,并在其中加入以下内容:

forms.py

接下来,由于您提到将收到的联系表单中的数据存储在数据库中,我们将添加一个模型Feedback,以跟踪收到的联系表单。在from django import forms class ContactForm(forms.Form): subject = forms.CharField(max_length=100) message = forms.CharField() sender = forms.EmailField(max_length=100) 文件中,添加以下内容:

models.py

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

我们还需要让Django在我们的数据库中为此反馈模型创建所需的表,因此在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) 的顶部插入以下有用的代码:

settings.py

并将import os PROJECT_DIR = os.path.dirname(__file__) 中的DATABASES设置更改为以下内容以使用sqlite数据库:

settings.py

最后,将INSTALLED_APPS设置更改为以下内容,以便在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. } } 的已安装应用程序列表中包含我们最近创建的应用myapp

mysite

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

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',
)

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

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

views.py

现在我们需要将URL映射到视图。打开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)) 并将其设为如下所示

mysite/urls.py

现在我们需要一些模板来显示联系表格&amp;谢谢你的页面。创建一个目录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)), ) ,在其中创建一个文件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> 页面,并在其中加入以下内容:

thanks.html

接下来,我们需要确保Django可以找到我们的模板,因此请将<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> 设置中的TEMPLATE_DIRS修改为以下内容:

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('\\', '/'),
)

转到http://localhost:8080/并尝试输入一些反馈。单击“提交”时,应将输入的详细信息放入数据库&amp;显示感谢页面。您可以检查详细信息是否已输入数据库:

$ ./mysite/manage.py runserver 8080

在shell中输入:

$ ./mysite/manage.py shell

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

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

在HTML中手动创建表单

如果您坚持这样做,您可以使用>>> from myapp.models import Feedback >>> for f in Feedback.objects.all(): print f 词典直接在视图中访问表单的请求变量,然后手动实例化对象的模型。调用save(就像在上面的request.POST视图函数中一样)。

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

其他教程

由于此问题的原始形式要求提供一些教程:official Django wiki有一个page listing some tutorials,其中一些处理表单。请注意,很多教程都很老(大多数是从2007年到2009年)。

答案 1 :(得分:2)

听起来你想要好好彻底地看一下

入门指南https://docs.djangoproject.com/en/dev/intro/

表单文档https://docs.djangoproject.com/en/dev/topics/forms/

之后你可能会想出这些内容。未经测试并迅速潦草地写在一起,可能充满了虫子。

models.py

from django.db import models

class Person(models.Model):
   user_name = models.CharField(max_length=30)
   real_name = models.CharField(max_length=30)
   site_played = models.CharField(max_length=30)

forms.py

from django import forms
class PlayerForm(forms.Form):
   user_name = forms.CharField(max_length=30)
   real_name = forms.CharField(max_length=30)
   site_played = forms.CharField(max_length=30)

views.py

def player_form(request):
    if request.method == 'POST': 
        form = PlayerForm(request.POST) 
        if form.is_valid(): 
            user_name = form.cleaned_data['user_name']
            real_name = form.cleaned_data['real_name']
            site_played = form.cleaned_data['site_played']
            player = Player(user_name=user_name, 
                            real_name=real_name, 
                            site_played=site_played)
            player.save()
            # Redirect to a thanks page maybe?

    else:
       form = ContactForm() 

    return render_to_response('contact.html', { 'form': form,})

contact.html

... lots of fancy html ...
{{ form }}
... more fancy html

答案 2 :(得分:2)

你需要这样的东西(自己阅读关于表单字段的验证):

models.py:

from django.db import models

class Player(models.Model):
    user_name = models.CharField()
    real_name = models.CharField()
    site_played = models.CharField()

forms.py:

from django import forms

MyForm(forms.Form):
   user_name = forms.CharField()
   real_name = forms.CharField()
   site_played = forms.CharField()

views.py:

from forms import MyForm
from models import Player

def new_player(request):
    #...
    if request.method == 'POST':
        form = MyForm(request.POST)

        if form.is_valid():
            player = Player()
            player.user_name = form.cleaned_data.get('user_name')
            player.real_name = form.cleaned_data.get('real_name')
            player.site_played = form.cleaned_data.get('site_played')
            player.save()
    #...
    return render_to_response('stakeme/new_player.html',
                              context_instance=RequestContext(request))

更新: 得到这个想法之后,你可能想看一下WTForms库。