Сбой ограничения NOT NULL: posts_comment.post_id django - PullRequest
0 голосов
/ 31 марта 2020

У меня есть основы приложения для блогов (я следую учебному пособию Кори Шафера, часть 10, если это важно), и я пытаюсь опубликовать и отобразить комментарии к сообщению, написанному другими пользователями, которые относятся только к этому сообщению , Аналогично разделу комментариев на Facebook или YouTube.

В настоящее время я отображаю все комментарии в базе данных для каждого сообщения, потому что я не знаю, как отфильтровать результаты, чтобы показывать только комментарии для указанных c пост, и я также не знаю, как публиковать комментарии к конкретному c посту, вот где я получаю сообщение об ошибке.

Мой код указан ниже:

Models.py

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date_posted = models.DateTimeField(default=timezone.now)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

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

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.user.username 

Views.py

class PostDetailView(DetailView):
    model = Post
    context_object_name = 'posts'

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

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    fields = ['content']

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

urls.py (Это URL-адреса. py-файл в моем основном приложении, где я вызываю представления блогов)

path('posts/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
path('posts/<int:pk>/comment', CommentCreateView.as_view(), name='comment-create'),

У меня есть эта форма в файле с именем comment_form. html, к которому я могу подключиться когда я попадаю на http://127.0.0.1: 8000 / posts / 5 / comment , но когда я нажимаю на кнопку reply, я получаю IntegrityError в / posts / 5 / comment Не выполнено ограничение NOT NULL: posts_comment.post_id

<form method="POST">
  {% csrf_token %}
  <fieldset class="form-group">
    <legend class="border-bottom mb-4"> Reply to Post </legend>
    {{ form|crispy}}
  </fieldset>
  <div class="form-group">. 
    <button type="submit" class="btn btn-success">Reply</button>
  </div>
</form>

Если бы кто-то мог бросить на него взгляд и дать мне знать, если вы найдете что-нибудь, что я мог бы сделать, чтобы заставить его работать, я был бы очень признателен. Дайте мне знать, если вам нужна дополнительная информация / код.

Спасибо

1 Ответ

0 голосов
/ 31 марта 2020

проблема в том, что в вашей форме создания отсутствует пропускаемое поле, поэтому django жалуется на "NOT NULL CONSTRAINT", поэтому вам нужно добавить поле записи в поля формы, или вы можете добавить в методе form_valid:

def form_valid(self, form):
        form.instance.post = Post.objects.get(pk=self.kwargs.get("pk"))
        form.instance.user = self.request.user
        return super().form_valid(form)

Если вы хотите игнорировать поле сообщения, вы можете поставить null = True в модели комментариев:

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post,null=True,blank=True,on_delete=models.CASCADE)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...