Web文本输入保存到数据库中,无需表单-Django Javascript

Web text input save into database without form- Django Javascript

本文关键字:表单 -Django Javascript 输入 文本 保存 数据库 Web      更新时间:2023-09-26

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

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

起初,我避开了表单,因为它们似乎想要单独的html页面进行输入。他询问了一位经验丰富的django程序员,帮我在页面上输入了一些javascript。他说我不需要通过表单和POST、GET来完成,因为文本的初始分数为0,当前日期为时间。

我现在的问题是,我无法在没有错误的情况下将输入的文本保存到数据库中。

由于我需要在2-3周内对此进行编程,而且我是django的新手(虽然我已经用PHP进行了一些处理,但我对javascript一无所知),所以我的问题是;

  • 我是否在保存到数据库的文本输入中遗漏了一些明显的内容

-和-

  • 有没有一种方法可以在一个页面中使用表单和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'),
)

型号.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);
        });
    }
});
});

视图.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(等等)而不会出错,

但当我取消注释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的额外功能,因为我对它非常陌生,在这一点上这将是另一个未知的层面。非常感谢任何意见。。。

您在视图函数中的错误添加:

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);
        });
    }
});

视图.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"。。。。