简体   繁体   中英

Django: create a comment form when user is authenticated

I'm creating a simple blog application. A user is logged in this application while He/She can comment any post on my blog application. But cant impletement that idea. This is my models.py file

from django.db import models

# Create your models here.

from user.models import CustomUser

from django.conf import settings
from django.db import models
from django.urls import reverse

class BlogPost(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    blog_title=models.CharField(max_length=200)
    blog_description=models.TextField()
    blog_pub=models.DateTimeField(auto_now_add=True)
    blog_update=models.DateTimeField(auto_now=True)


    def __str__(self):
        return self.blog_title


    def get_absolute_url(self):

        return reverse('blog:blog_post', kwargs={'pk': self.pk})




class Comment(models.Model):
    blogpost=models.ForeignKey(BlogPost, on_delete=models.CASCADE)
    comment=models.CharField(max_length=300)
    author=models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,blank=True, null=True)
    author_name = models.CharField(max_length=50, default='anonymous', verbose_name=("user name"))
    comment_pub = models.DateTimeField(auto_now_add=True)

    comment_update = models.DateTimeField(auto_now=True)

    def get_absolute_url(self):
        return reverse('blog:home', kwargs={'pk':self.pk})

    def __str__(self):
        return self.comment

This is views.py file

class BlogPostSingle(DetailView, FormView):
    model=BlogPost
    template_name='blog/blog_post_single.html'
    #fields = ['blog_title']
    form_class = CreateCommentForm
    success_url = '/blog/'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

this is my forms.py file

class CreateCommentForm(ModelForm):
    class Meta:
        model=Comment
        fields = ('comment', 'blogpost')

and this is my html file and forms section

{% if user.is_authenticated %}
        <h5>Hi, {{user.name}} leave your comment now</h5>
        <form action="" method="post">
            {% csrf_token %} {{form.as_p}}

            <input type="submit" value="Submit comment">
        </form>
        {% else %}
        <p>You're not logged in this site, please  <a href="{% url 'login' %}">log</a> in for comment </p>
        {% endif %}

My target Idea: Just user logged on my blog application. He can be able to comment any post on my blog application. And my Comment Models contain two forignkey field.

You should pass the user to your view's context, so it will be available in the template:

class BlogPostSingle(DetailView, FormView):
    ...
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['user'] = self.request.user
        return context

on get_context_data see https://docs.djangoproject.com/en/2.0/ref/class-based-views/generic-display/#detailview

on self.request see https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-display/#dynamic-filtering

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM