【问题标题】:Django: Modelform auto-create form in templateDjango:Modelform在模板中自动创建表单
【发布时间】:2013-06-12 03:21:18
【问题描述】:

我在 python 上只工作了大约 2 周,并且遇到了一个问题,我在过去 3 天里一直在试图解决这个问题。我已经阅读了官方文档以及几乎所有可用的教程和 youtube 视频。

我正在尝试构建一个简单的博客作为第一个项目,并希望有一个人们可以发布 cmets 的部分。我已经建立了 cmets 模型和一个 modelform 来配合它。但是,我不知道如何让 django 在模板中为我创建表单,没有显示任何内容。

models.py

    from django.db import models
    from django.forms import ModelForm

    class posts(models.Model):
        author = models.CharField(max_length = 30)
        title = models.CharField(max_length = 100)
        bodytext = models.TextField()
        timestamp = models.DateTimeField(auto_now_add=True)

        def __unicode__(self):
            return self.title

    class comment(models.Model):
        timestamp = models.DateTimeField(auto_now_add=True)
        author = models.CharField(max_length = 30)
        body = models.TextField()
        post_id = models.ForeignKey('posts')

        def __unicode__(self):
            return self.body

    class commentform(ModelForm):
        class Meta:
            model = comment

views.py

from django.shortcuts import render_to_response
from blog.models import posts, comment, commentform
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf


def home(request):
    entries = posts.objects.all()
    return render_to_response('index.html', {'posts' : entries})

def get_post(request, post_id):
    post = posts.objects.get(id = post_id)
    context = {'post': post}
    return render_to_response('post.html', context)

def add_comment(request, post_id):
    if request.method == 'POST':
        form = commentform(request.POST)
        if form.is_valid():
            new_comment = form.save(commit = false)
            new_comment.post_id = post_id
            new_comment.save()
    else:
        form = commentform()

    context = RequestContext(request, {
        'form': form})

    return render_to_response('post.html', context)

网址.py

    from django.conf.urls import patterns, include, url
    from django.conf import settings
    from django.contrib import admin
    admin.autodiscover()

    urlpatterns = patterns('',
        url(r'^$', 'blog.views.home', name='home'),
        url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
        url(r'^admin/', include(admin.site.urls)),
        url(r'^(?P<post_id>.*)/$', 'blog.views.get_post'),
        url(r'^post_comment/(\d+)/$','blog.view.add_comment'),

post.html

{% extends 'base.html' %}

{% block content %}
    <p><h3> {{ post }} </h3></p>
    <p> {{ post.bodytext }} </p>

<br><br><br><br>

<form action="/post_comment/{{ post.id }}/" method="POST"> {% csrf_token %}
    {{ form }}
    <input type="submit" value="Post">
</form>

{% endblock %}

我确实收到 403 错误 CSRF 验证失败,但我认为更紧迫的问题是 {{ form }} 在模板中没有做任何事情。

我相信 home 函数和 get_post 函数正在运行,并且所有 url 都正常运行。所以,我认为 add_comment 函数或 posts.html 中有问题。

谢谢

【问题讨论】:

    标签: python django templates blogs modelform


    【解决方案1】:

    Django 并不神奇。您的评论表单与显示博客文章的表单完全不同。那么 Django 应该如何知道渲染它呢?您实际上需要以某种方式将表单对象传递给模板。

    在旧的 contrib.cmets 应用程序中执行此操作的方式是使用一个简单的模板标记,该标记仅负责显示对象的评论表单,您可以将其放置在任何模板上。表单本身像往常一样提交给自己的视图。

    【讨论】:

    • 不知道我是怎么错过的...现在通过将表单放在 get_post 视图中来显示表单。谢谢。
    【解决方案2】:

    您可能要检查的一件事是 render_to_response 调用的语法。我相信你会想这样定义它。 (也许你的语法也可以,这不是问题,但我大多看到这样的调用)。这可能是上下文中缺少表单的原因。

    return render_to_response('post.html',
                          {'form': form},
                          context_instance=RequestContext(request))
    

    让我知道这是否有效。希望这可以帮助, 乔

    参考:https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.render_to_response

    【讨论】:

    • 注意:一般来说,为所有视图传递上述请求上下文是一个好主意(对于基于类的视图自动完成),因为我相信这对于诸如静态和 csrf 中间件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2023-04-05
    • 2013-03-22
    • 2016-08-20
    • 2011-04-12
    相关资源
    最近更新 更多