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文档,但我觉得我只是复合了一些我不理解的东西.如果有人能指出我正确的方向,我会非常感激.
首先,您不需要定义新视图来处理表单数据.此外,您正在使用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).
| 归档时间: |
|
| 查看次数: |
3264 次 |
| 最近记录: |