我有一个django 1.6的sqlite3数据库设置,我希望网络用户能够在同一页面上输入文本并在3个实时表格(高,低和最新)中查看。理想情况下,一个页面应该具有文本输入,投票,在新条目进入或投票时更新的三个表的显示,以及如果可能的话搜索(如果所有这些都被排序(个人项目,而不是商业))。如果重要的话,我也在win7 64上...
目前我有:一个工作数据库,三个表显示在一个没有更新的网页中,一些网页文本通过js输入(并且无法保存到Django中的数据库)。
我最初避开表单,因为他们似乎想要单独的html页面进行输入。问一位经验丰富的django编码员,他帮助我在页面上输入一些javascript文本。他说我不需要通过表格和POST,GET这样做,因为文本只是以0的初始分数和当前的日期时间进行。
我现在的问题是我无法将输入的文本保存到数据库中而不会出错。
由于我需要在2-3周内对此进行编程并且是django的新手(并且忘记了javascript,尽管我已经使用PHP完成了一些处理),但我的问题是;
- 和 -
我现在将开始尝试使用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 }}  {{ 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')
我不确定如何定义用于填充条目的字段....上面看起来是否合适?
我可以在没有错误的情况下取消注释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因为我对它非常不熟悉而且它会是在这一点上另一个未知的水平。任何输入都非常感谢...
答案 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'。