Разрешить комментировать сообщение только авторизованному пользователю - PullRequest
0 голосов
/ 20 сентября 2019

У меня проблемы с получением автора комментария, когда форма отправляет

Это отлично работает для моего метода публикации, не так много для комментирования сообщения

Модели.py

    class Post(models.Model):
        title = models.CharField(max_length=100)#title of a post
        content = models.TextField()
        date_posted = models.DateTimeField(default=timezone.now)
        author = models.ForeignKey(User, on_delete=models.CASCADE) #if a user is deleted all of their post will be as well
        view_count = models.IntegerField(default=0)


    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

class Comment(models.Model):
    post = models.ForeignKey('forum.Post', on_delete=models.CASCADE, related_name='comments')
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField(null=True)
    created_date = models.DateTimeField(default=timezone.now)


    def __str__(self):
        return self.text

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

Views.py

class CommentCreate(LoginRequiredMixin,CreateView):
    model = Comment
    fields = ['text']

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

class PostCreate(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'content']

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

class PostDetail(DetailView):
    model = Post


    def get_context_data(self, **kwargs):
        data = super(PostDetail, self).get_context_data(**kwargs)
        vc = self.object.view_count
        self.object.view_count = F('view_count') + 1
        self.object.save()
        self.object.view_count = vc + 1
        return data

Шаблон Post_detail

{% extends "forum/base.html" %}

{% block content %}
    <article class="media content-section">
      <div class="media-body">
        <div class="article-metadata">
          <a class="mr-2" href="#">{{ object.author }}</a>
          <small class="text-muted">{{ object.date_posted }}</small>
          <small class="text-muted">{{ object.view_count }}</small>
          {% if object.author == user %}
            <div>
              <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'post-update' object.id %}">Update</a>
              <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'post-delete' object.id %}">Delete</a>
            </div>
          {% endif %}
        </div>
        <h2 class="article-title">{{ object.title }}</h2>
        <p class="article-content">{{ object.content }}</p>
        <a class="btn btn-default" href="{% url 'add_comment_to_post' pk=post.pk %}">Add comment</a>
        {% for comment in post.comments.all %}
          <div class="comment">
            <div class="date">{{ comment.created_date }}</div>
              <strong>{{ comment.author }}</strong>
              <p>{{ comment.text|linebreaks }}</p>
            </div>
            {% empty %}
            <p>No comments here yet :(</p>
            {% endfor %}
      </div>
    </article>
{% endblock content %}

ОшибкаЯ получаю "Не удалось выполнить ограничение NULL: forum_comment.author_id"Я не уверен, что отличается от моего поста CreateView

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

У вас есть два опечатки

for_valid должно быть form_valid

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

и self.request.users должно быть self.request.user

0 голосов
/ 20 сентября 2019

Создайте ModelForm для Comment в файле forms.py внутри приложения:

# your_app/forms.py

from django import forms
from .models import Comment

class CommentModelForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['post', 'text']
        widgets = {
            'post': forms.HiddenInput(),
            'text': forms.Textarea(attrs={'placeholder': 'Write your comment here...'}),
        }

После этого отредактируйте представление PostDetail, чтобы вы могли передать CommentModelForm с помощью post экземпляр уже установлен в виде:

class PostDetail(DetailView):
    model = Post

    def get_context_data(self, **kwargs):
        data = super(PostDetail, self).get_context_data(**kwargs)
        vc = self.object.view_count
        self.object.view_count = F('view_count') + 1
        self.object.save()
        self.object.view_count = vc + 1
        initial_comment_data = {
            'post': self.object,
        }
        data['comment_form'] = CommentModelForm(initial=initial_comment_data)
        return data

Добавьте CommentModelForm к вам CommentCreate view:

class CommentCreate(LoginRequiredMixin,CreateView):
    model = Comment
    form_class = CommentModelForm

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

И, наконец, шаблон вашего PostDetail долженвыглядеть так:

# your_app/templates/your_app/post_detail.html

...
<form method="POST" action="{% url 'yourapp:comment-create' %}">
  {% csrf_token %}
  {{ comment_form }}
  <button type="submit">Place a comment</button>
</form>
<div>
  {% for comment in post.comments.all %}
    <p>{{ comment.text }} - by {{ comment.author }} at {{ comment.created_date }}</p>
  {% empty %}
    <p>No comments yet. Be the first one!</p>
  {% endfor %}
</div>
0 голосов
/ 20 сентября 2019

Попробуйте self.request.user вместо self.request.users .А также измените for_valid на form_valid .Если это не сработает, попробуйте что-то вроде этого. new_comment - это экземпляр , который можно сохранить здесь и вернуть из функции вместо формы .

Внутри form_valid функции CommentCreate class

     new_post = form.save(commit=False)
     new_post.author = self.request.user
     new_post.save()
     return new_post

Внутри form_valid функции PostCreate класс:

     new_comment = form.save(commit=False)
     new_comment.author = self.request.user
     new_comment.post = super().form_valid(form)         
     new_comment.save()
     return new_comment 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...