Skip to main content
 首页 » 编程设计

python之Django:Modelform 在模板中自动创建表单

2025年05月04日34jillzhang

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

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

模型.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 

View .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 有问题。

谢谢

请您参考如下方法:

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

这在旧的 contrib.comments 应用程序中完成的方式是有一个简单的模板标签,它负责只显示对象的评论表单,您可以将其放置在任何模板上。表单本身像往常一样提交给自己的 View 。