user1801517
user1801517

Reputation:

Django Template Form Render

My problem is not to show django form fields on template.It's silly but I just haven't found any solution.

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

my view:

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')) 

my add_comment template:

  <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>

and I included like:

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

why not django rendered form fields,despite of showing buttons?

EDIT:

I'm rendering form in post view.

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

                   }
                  )

Upvotes: 1

Views: 6136

Answers (2)

fasouto
fasouto

Reputation: 4511

You forgot to instantiate the form, change this line:

'form': CommentForm,

to this

'form': CommentForm(),

Upvotes: 1

NotSimon
NotSimon

Reputation: 1815

In your view, you're not sending any context variables to the template, so your 'form' object isn't available for your template to process.

For example, the following return statement will render your .html and pass along all local variables, this isn't necessarily the best option (how much do you want your template to have access to), but is simple:

from django.shortcuts import render

...

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

you can also pass a dictionary instead of all local variables. Here's the documentation for render

Upvotes: 0

Related Questions