Max
Max

Reputation: 41

Django class based view and comments

I'm having trouble with adding comments to class based views, forms.py:

  class RequestForm(ModelForm):
      class Meta:
          model = Request
          exclude = ('slug',)
  class RequestCommentForm(ModelForm):
      class Meta:
          model = RequestComment
          fields = ['body' ]

models.py:

class Request(models.Model):
    title = models.CharField(max_length=250 )
    date = models.DateTimeField('Request date', default=timezone.now, editable=False )
    department = models.CharField(max_length=2, choices=DEPARTMENT)
    support_request = models.TextField('Request', max_length=2500, blank=True)
    owner = models.ForeignKey(User,)
    slug = models.SlugField(blank=True, editable=False)

    def __unicode__(self):
        return self.title

views.py:

class RequestDetailView(ModelFormMixin, DetailView):
    model = Request
    form_class = RequestCommentForm

    def get_success_url(self):
        return reverse('request-detail', kwargs={'pk': self.object.pk})

    def get_context_data(self, **kwargs):
        context = super(RequestDetailView, self).get_context_data(**kwargs)
        context['form'] = self.get_form()
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
    def form_valid(self, form):
        form.instance.author = self.request.user
        form.instance.request = Request.objects.get(pk=self.object.pk)
        form.instance.created = timezone.now
        form.save()
Also tried this part with:
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.request = Request.objects.get(pk=self.object.pk)
        self.object.created = timezone.now
        self.object.save()
        return super(RequestDetailView, self).form_valid(form)

template: request_detail.html comments section .....

{% load bootstrap %}
<form action="{% url 'request-detail' object.id %}" method="post"> {% csrf_token %}
        <ul class="form-group">
        {{ form|bootstrap }}
        </ul>
        <input class="btn btn-primary" type="submit" value="Submit" />
</form>

.....

Page renders correctly, but when I submit, no-go with saving comment.

Debug toolbar shows that sql queries are updating the request model, instead of request comment.

Can't figure out how to add simple comment form from different model to detail page. Any help would be appreciated.

Also, if there is more elegant way off adding comments form to class based view, would love to see it. My google-fu didn't help me to find anything.

Upvotes: 4

Views: 3373

Answers (2)

wilson irungu
wilson irungu

Reputation: 77

I know I'm answering this too late, but maybe someone with the same question, in the future, may benefit.

Class RequestDetailView(DetailView):
    model = Request
    template_name = 'detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context ['comment'] = RequestComment.objects. all()
        context['form'] = RequestCommentForm()
        return context


Class CommentCreateView(CreateView):
    model = RequestComment
    form_class = RequestCommentForm

    def get_success_URL(self):
        return reverse ('request: detail', kwargs = {'slug':self.object.post.slug})

    def form_valid(self, form):
        post = get_object_or_404(Request, slug = self.kwargs ['slug'])
        Form.instance.post = Request
        return super().form_valid(form)

The URL

path('<slug:slug>/add_comment/', CommentCreateView.as_view(), name = add_comment')

And finally the HTML

    <form action="{% url 'request:add_comment' request.slug %}" enctype = "multiparty/form-data" method = "post">
    </form>

And that's it. I answered using my phone so there's some typos etc. This is my first answer here, I searched stack overflow for answers I'll post links later. I assumed RequestComment foreignkey field is post and creating models with name 'request' is not encouraged in Django.

Upvotes: 3

Max
Max

Reputation: 41

Wish I could find a way to do this with CBV, but nope.. function view works great...

class RequestDetailView(ModelFormMixin, DetailView):
    model = Request
    form_class = RequestCommentForm

    def get_success_url(self):
        return reverse('request-detail', kwargs={'pk': self.object.pk})

    def get_context_data(self, **kwargs):
        context = super(RequestDetailView, self).get_context_data(**kwargs)
        context['form'] = self.get_form()
        return context

    def comments(self):
        return RequestComment.objects.filter(request=Request.objects.get(pk=self.object.pk))


def RequestCommentAddView(request, pk):
    form = RequestCommentForm(request.POST or None)

    if form.is_valid() and pk:
        form.instance.author = request.user
        form.instance.request = Request.objects.get(pk=pk)
        form.save()
        return HttpResponseRedirect(reverse('request-detail', kwargs={'pk': pk}))
    return HttpResponseRedirect(reverse('request-detail', kwargs={'pk': pk}))

Upvotes: 0

Related Questions