Django: Как заполнить другие поля модели, когда кто-то оставляет комментарий - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь разрешить кому-либо оставлять комментарии в блоге, но в моей модели есть другие поля, которые должны получать информацию, которая не требуется в самой форме. Я пробовал добавить его в метод form_valid, но этот метод не вызывается при отправке формы. Любая помощь приветствуется

views.py

class CommentView(CreateView):
    template_name = "core/index.html"
    model = Comment
    form_class = CommentForm

    def get_success_url(self):
        return reverse_lazy("core:home")

    def form_valid(self, form):
        print("form is valid")
        form.save()
        return super().form_valid(form)

forms.py

class CommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = [
            "text",
        ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["text"].widget.attrs.update(
            {"class": "form-control", "placeholder": "Enter Your Comment Here",}
        )

models.py

class Comment(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(
        BlogPost, on_delete=models.CASCADE, related_name="comments"
    )
    text = models.TextField(max_length=255, default="")
    date_posted = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"({self.author})'s comment on ({self.post.title})"

urls.py

app_name = "blog"
urlpatterns = [
    path("post/<int:pk>/", BlogPostDetailView.as_view(), name="detail"),
    path("post/category/<int:pk>/", CategoryListView.as_view(), name="category"),
    path("post/comment/<int:pk>/", CommentView.as_view(), name="comment"),
]

1 Ответ

0 голосов
/ 07 августа 2020

Вы можете попробовать вот так:

class CommentView(CreateView):
    template_name = "core/index.html"
    model = Comment
    form_class = CommentForm

    def get_success_url(self):
        return reverse_lazy("core:home")

    def form_valid(self, form):
        <b>form.instance.post_id = self.kwargs['pk']
        form.instance.author = self.request.user</b>
        return super().form_valid(form)

Здесь я предполагаю, что вы передаете значение Post (первичный ключ) через атрибут pk URL-адреса, а form.instance имеет новый (не пока сохранены в БД) Comment объект. Затем я прикрепляю значение request.user (текущий пользователь) и идентификатор публикации к этому экземпляру.

...