【问题标题】:Python and Django Blog Sample ProjectPython 和 Django 博客示例项目
【发布时间】:2013-03-31 12:56:04
【问题描述】:

我是 python 和 Django 的新手,我已经开始了一个示例项目“博客”。

目前博客文章是手动添加到数据库中的,但我想在前端通过向用户提供表单来完成。我创建了我的model.pyviews.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 模型表单的情况下实现这一目标。

谢谢

【问题讨论】:

标签: django django-models python-2.7 django-forms django-views


【解决方案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/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
相关资源
最近更新 更多