我有一个在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文档,但我觉得我只是复合了一些我不理解的东西。如果有人能指出我正确的方向,我会非常感激。
答案 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库。