在Django中使用JavaScript将网页文本输入保存到数据库

0 投票
1 回答
3149 浏览
提问于 2025-04-18 02:19

我在用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 }}&nbsp;&nbsp;&nbsp;&nbsp{{ entry.score }}</a></li>
 {% endfor %}
 </ul>
 <ul>
 {% for entry in high_entry_list %}
    <li><a href="/entries/{{ entry.id }}/">{{ entry.text }}&nbsp;&nbsp;&nbsp;&nbsp{{ entry.score }}</a></li>
 {% endfor %}
 </ul>
 <ul>
 {% for entry in low_entry_list %}
    <li><a href="/entries/{{ entry.id }}/">{{ entry.text }}&nbsp;&nbsp;&nbsp;&nbsp{{ 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 个回答

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'。

撰写回答