Web文本输入保存到数据库没有形式 - Django Javascript

时间:2014-04-11 09:43:41

标签: javascript jquery python django sqlite

我有一个django 1.6的sqlite3数据库设置,我希望网络用户能够在同一页面上输入文本并在3个实时表格(高,低和最新)中查看。理想情况下,一个页面应该具有文本输入,投票,在新条目进入或投票时更新的三个表的显示,以及如果可能的话搜索(如果所有这些都被排序(个人项目,而不是商业))。如果重要的话,我也在win7 64上...

目前我有:一个工作数据库,三个表显示在一个没有更新的网页中,一些网页文本通过js输入(并且无法保存到Django中的数据库)。

我最初避开表单,因为他们似乎想要单独的html页面进行输入。问一位经验丰富的django编码员,他帮助我在页面上输入一些javascript文本。他说我不需要通过表格和POST,GET这样做,因为文本只是以0的初始分数和当前的日期时间进行。

我现在的问题是我无法将输入的文本保存到数据库中而不会出错。

由于我需要在2-3周内对此进行编程并且是django的新手(并且忘记了javascript,尽管我已经使用PHP完成了一些处理),但我的问题是;

  • 我是否遗漏了一些明显的文字输入保存到数据库?

- 和 -

  • 有没有办法让所有这些使用表格和GET,POST在一个页面 所以我可以避免大量的javascript(除非它真的更容易)?

我现在将开始尝试使用Forms来构建它,但希望能从更明智的头脑中获得关于最佳实践的一些指导。

到目前为止,这是代码:

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

我不确定如何定义用于填充条目的字段....上面看起来是否合适?

我可以在没有错误的情况下取消注释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 extras因为我对它非常不熟悉而且它会是在这一点上另一个未知的水平。任何输入都非常感谢...

1 个答案:

答案 0 :(得分:1)

您在视图功能中的错误添加:

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

更新 - 解决方案

除了以下更改之外,解决方案是在视图中添加'from datetime import datetime'。