在Django中使用JavaScript将网页文本输入保存到数据库
我在用Django 1.6搭建一个sqlite3数据库,想让网页用户可以输入文本,并在同一页面上看到三个实时更新的表格(高分、低分和最新)。理想情况下,这个页面应该有文本输入、投票功能、三个表格的显示,并且在有新输入或投票时能够更新,如果能加个搜索功能就更好了(这是个人项目,不是商业用途)。我现在用的是win7 64位,如果这有影响的话……
目前我已经有了一个正常工作的数据库,三个表格可以在网页上显示,但没有更新功能,还有一些通过js实现的网页文本输入(但在Django中无法保存到数据库)。
一开始我对表单有些犹豫,因为它们似乎需要单独的html页面来输入。向一位有经验的Django程序员请教后,他给我提供了一些用于页面文本输入的javascript代码。他说我不需要通过表单和POST、GET来处理,因为文本只是以初始分数0和当前时间戳的形式进入数据库。
我现在的问题是,输入的文本无法保存到数据库,并且出现错误。
因为我需要在2-3周内完成这个项目,而且我对Django还是新手(对javascript也不太了解,虽然我用PHP做过一些Processing),所以我有几个问题:
- 我在文本输入保存到数据库的过程中是不是漏掉了什么明显的东西?
-还有-
- 有没有办法在一个页面上使用表单和GET、POST,这样我可以避免很多javascript(除非用js真的更简单)?
我现在打算开始尝试用表单来构建这个项目,但希望能从更有经验的人那里得到一些最佳实践的指导。
这是我目前的代码:
urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^i/$', 'entries.views.index'),
url(r'^add/(.*)$', 'entries.views.add'),
)
Models.py
from django.db import models
import datetime
from django.utils import timezone
class Entry(models.Model):
text = models.CharField(max_length=15)
score = models.IntegerField(default=0)
pub_date = models.DateTimeField('date published')
def __unicode__(self):
return self.text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
index.html
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
</head>
<body>
<ul>
{% for entry in latest_entry_list %}
<li><a href="/entries/{{ entry.id }}/">{{ entry.text }}  {{ entry.score }}</a></li>
{% endfor %}
</ul>
<ul>
{% for entry in high_entry_list %}
<li><a href="/entries/{{ entry.id }}/">{{ entry.text }}  {{ entry.score }}</a></li>
{% endfor %}
</ul>
<ul>
{% for entry in low_entry_list %}
<li><a href="/entries/{{ entry.id }}/">{{ entry.text }}  {{ entry.score }}</a></li>
{% endfor %}
</ul>
<style type="text/css" media="screen">
div h2 span { color: #ff0000; }
div span { color: #00ff00; }
#box { width: 400px; height: 400px; }
#h { color: #ff0000; }
</style>
<h3 id="h">title</h3>
<p>message: {{ text }}</p>
<input type="text" name="word" value="" id="input"/>
<script type="text/javascript" src="{{STATIC_URL}}post.js"></script>
</body>
post.js
console.log("hi from js");
$(document).ready(function() {
$("#input").bind("keypress", function(e) {
//enter key pressed
if (e.keyCode == 13) {
var args = {};
var text = $("#input").val();
$.get("/add/" + text, args).done(function(data) {
console.log("message: " + data);
});
}
});
});
views.py
from django.shortcuts import render
from django.http import HttpResponse
from entries.models import Entry
from django.db import models
import datetime
from django.utils import timezone
def index(request):
context = {
'latest_entry_list': Entry.objects.order_by('-pub_date')[:10],
'high_entry_list': Entry.objects.order_by('-score')[:10],
'low_entry_list': Entry.objects.order_by('score')[:10],
}
return render(request, 'entries/index.html', context);
def add(request, thingtoadd):
#created_date = models.DateTimeField('date published', default=datetime.now)
#created_score = '0'
#created_text = 'test'
#e = Entry(text=created_text, score=created_score,pub_date=created_date)
#e.save()
return HttpResponse('done')
我不太确定如何定义字段来填充Entry……上面的代码看起来对吗?
我可以在不出错的情况下取消注释e=Entry(etc...),
但当我取消注释e.save()时,出现的错误是:
GET http://127.0.0.1:8000/add/a 500 (INTERNAL SERVER ERROR) jquery.min.js:4
send jquery.min.js:4
n.extend.ajax jquery.min.js:4
n.(anonymous function) jquery.min.js:4
(anonymous function) post.js:15
n.event.dispatch jquery.min.js:3
r.handle
我会继续尝试用表单来实现这个功能,但想知道是否有好的建议,是否真的可以做到——我希望尽量避免使用js,因为我对它非常不熟悉,这在目前来说又是一个未知的领域。非常感谢任何建议……
1 个回答
你在视图函数add中的错误:
created_date = models.DateTimeField('date published', default=datetime.now)
这里必须是赋值:
created_date = datetime.now()
而不是字段定义。
你可以提前在你的模型中指定auto_now_add=True:https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield
这样的话,字段会自动填充。
补充说明:
urls.py中有错误。
你需要做一些修正:
urls.py:
url(r'^add/$', 'entries.views.add'),
post.js
$("#input").bind("keypress", function(e) {
//enter key pressed
if (e.keyCode == 13) {
var text = $("#input").val();
var args = {'text': text};
$.get("/add/", args).done(function(data) {
console.log("message: " + data);
});
}
});
views.py
def add(request):
created_date = default=datetime.now()
created_score = '0'
created_text = request.GET.get('text')
e = Entry(text=created_text, score=created_score,pub_date=created_date)
e.save()
return HttpResponse('done')
更新 - 解决方案
除了下面的更改,解决方案还包括在views中添加'from datetime import datetime'。