Python 和 Django 博客示例项目
Posted
技术标签:
【中文标题】Python 和 Django 博客示例项目【英文标题】:Python and Django Blog Sample Project 【发布时间】:2013-03-31 12:56:04 【问题描述】:我是 python 和 Django 的新手,我已经开始了一个示例项目“博客”。
目前博客文章是手动添加到数据库中的,但我想在前端通过向用户提供表单来完成。我创建了我的model.py
和views.py
文件,但我无法在前端看到这些字段。我在下面复制了我的所有代码:
models.py:
class posts(models.Model):
author = models.CharField(max_length = 30)
title = models.CharField(max_length = 100)
bodytext = models.TextField()
timestamp = models.DateTimeField()
class postForm(ModelForm):
class Meta:
model = posts
views.py:
def home(request):
content = posts.objects.all()[:5]
return render_to_response('index.html','posts' : content)
def save_blog(request):
form = postForm
if request.POST:
form = postForm(request.POST)
if form.is_valid():
form.save
return render_to_response('index.html','form' : form,context_instance=RequestContext(request))
url.py:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns =
patterns('',
url(r'^$', 'blog.views.home', name='home'),
url(r'^admin/', include(admin.site.urls))
)
index.html:
<body>
<div class="container">
<h1>Welcome To</h1>
<hr />
% for post in posts %
<div class="posts">
<h2> post.title </h2>
<h3>Posted on post.timestamp by post.author </h3>
<p> post.bodytext </p>
</div>
<hr />
% endfor %
</div>
<div class="forms">
<form action="." method="post" name="posts" id="posts">% csrf_token %
<table>
<tr><td>form.author.label</td><td>form.author</td></tr>
<tr><td>form.title.label</td><td>form.title</td></tr>
<tr><td>form.bodytext.label</td><td>form.bodytext</td></tr>
<tr><td></td><td><input type="button" name="btnSave" id="bntSave" value="Submit" class = "default2"/></td>
</table>
</form>
</div>
</body>
settings.MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
如果我遗漏了什么,请告诉我。也请告诉我如何在不使用 Django 模型表单的情况下实现这一目标。
谢谢
【问题讨论】:
如果你是新用户,你必须使用这样的spmething来命名python中的类。看到这个python.org/dev/peps/pep-0008/#class-names 在视图中使用表单的模式已明确给出in the documentation。你为什么不用那个? 【参考方案1】:views.py
def home(request):
content = posts.objects.all()[:5]
form = postForm()
if request.POST:
form = postForm(request.POST)
if form.is_valid():
form.save()
return render_to_response('index.html','posts' : content, 'form' : form, context_instance=RequestContext(request))
index.html
<div class="forms">
<form method="post" name="posts" id="posts">
% csrf_token %
form.as_table
<input type="button" name="btnSave" id="bntSave" value="Submit" class="default2"/> //<---------------
</form>
</div>
更新:
好的,我现在明白它为什么不提交了。你在输入类型中输入了button
而不是submit
<input type="submit" name="btnSave" id="bntSave" value="Submit" class="default2"/> //<---------------
只需在您的时间戳字段中添加auto_now_add
timestamp = models.DateTimeField(auto_now_add=True)
【讨论】:
我觉得仅仅修复人们的代码并不能真正帮助他们,尤其是没有解释......我认为这会让事情变得更糟(至少对我来说),因为他们最终会复制粘贴而不是通过它。 我不想复制和粘贴,如果我这样做,我什么也学不会。所以请给出解释。 @catherine 我希望你明白我在这里想要做什么,实际上 def home 是一个用于从后端获取数据并将其放入 index.html 的函数。 save_blog 是我试图将 html 数据保存到后端的另一个函数。我做得对吗? 取决于,您在浏览器中访问的是哪个视图?home
视图中没有表单。
@Razer 我明白你想做什么。但是你做错了。您必须在 home 中定义 postForm()
以便它显示表单。明白了吗?【参考方案2】:
您的表单看起来像是 postForm
,但您的视图中使用的是 posts_form
...
我也不确定form_save
是什么,您应该在表单实例上调用save()
,例如
if form.is_valid():
form.save()
并且在发布后,通常会将用户重定向到另一个 url 以防止重新提交数据。
【讨论】:
@Razer 你应该看看Daniel Roseman发布的link 我正在尝试,现在谁能告诉我这是什么意思:return HttpResponseRedirect('/thanks/') 为什么感谢被 /.../ 包围并且是一个 html 文件?跨度> @Daniel Roseman 我的新视图 Py 看起来像这样:def home(request): content = posts.objects.all()[:5] return render_to_response('index.html', 'posts' : content) def save_blog(request): if request.method == 'POST': # 如果表单已经提交... form = postForm(request.POST) # 绑定到 POST 数据的表单if form.is_valid(): return HttpResponseRedirect('/thanks/') POST else: form = postForm() return render(request, 'index.html', 'form': form, ) 但它没有在模板中显示这些字段。 我的新视图 Py 看起来像这样:def home(request): content = posts.objects.all()[:5] return render_to_response('index.html','posts ' : content) def save_blog(request): if request.method == 'POST': # 如果表单已经提交... form = postForm(request.POST) # 绑定到 POST 数据的表单 if form. is_valid(): return HttpResponseRedirect('/thanks/') POST else: form = postForm() return render(request, 'index.html', 'form': form, ) 但它没有显示那些模板中的字段。 @Razer 看起来您可以让事情正常进行,但要回答您的第一个问题,HttpResponseRedirect
只需返回带有位置标头的 302 响应以重定向浏览器。请参阅此处了解更多信息docs.djangoproject.com/en/dev/ref/request-response/…以上是关于Python 和 Django 博客示例项目的主要内容,如果未能解决你的问题,请参考以下文章
Django搭建个人博客平台2---创建一个Django项目和项目梳理
项目实战基于Python+Django+MySQL的个人博客系统(附完整源码)