Django模板表单渲染

时间:2013-10-03 14:59:58

标签: django forms field render

我的问题不是在模板上显示django表单字段。这很傻但我还没有找到任何解决方案。

class CommentForm(forms.ModelForm):

    class Meta:
        model = Comment
        fields = ['name', 'email', 'text']

    def __init__(self, content_type, id, *args, **kwargs):
        super(CommentForm, self).__init__(*args, **kwargs)
        self.content_type = content_type
        self.id = id

    def save(self, commit=True):

        post_type = ContentType.objects.get_for_model(Post)
        comment_type = ContentType.objects.get_for_model(Comment)
        comment = super(CommentForm, self).save(commit=False)

        if self.content_type == 'post':
            comment.content_type = post_type
            comment.post = self.id
        else:
            parent = Comment.objects.get(id=self.id)
            comment.content_type = comment_type
            comment.post = parent.post

        comment.object_id = self.id


        if commit:
            comment.save()

        return comment

我的观点:

def add_comment(request, content_type, id):

    if request.method == 'POST':
        data = request.POST.copy()
        form = CommentForm(content_type, id, data)
        if form.is_valid():
            form.save()

    return redirect(reverse('index')) 

我的add_comment模板:

  <form method="post" action="{% url 'add_comment' 'post' post.id %}">
  {% csrf_token %}

  {% if not user.is_authenticated %}
  {{ form.name.label_tag }}
  {{ form.name }}

  {{ form.email.label_tag }}
  {{ form.email }}
  {% endif %}


  {{ form.text.label_tag }}
  {{ form.text }}<br>


  <input type="submit" value="Comment" />

  </form>

和我一样包括:

<button id="button" type="button">Add Comment</button>
  <div id="post_comment_form">{% include 'articles/add_comment.html' %}</div>
</article> <!-- .post.hentry --> 

为什么不是django渲染表单字段,尽管显示按钮?

修改

我在后期视图中渲染表单。

def post(request, slug):

    post = get_object_or_404(Post, slug=slug)
    comments = Comment.objects.filter(post=post.id)


    return render(request,
                  'articles/post.html',
                  {'post': post,
                   'form': CommentForm,
                   'comments': comments,
                   # 'child_comments': child_comments

                   }
                  )

2 个答案:

答案 0 :(得分:1)

您忘记实例化表单,请更改此行:

'form': CommentForm,

到这个

'form': CommentForm(),

答案 1 :(得分:0)

在您的视图中,您没有向模板发送任何上下文变量,因此您的“表单”对象无法供您的模板处理。

例如,以下return语句将呈现您的.html并传递所有局部变量,这不一定是最佳选项(您希望模板有多少访问权限),但很简单:

from django.shortcuts import render

...

return render(request, "template.html", locals())

您也可以传递字典而不是所有局部变量。这是render

的文档