Заполнение многих строк формы экземплярами модели в django не работает
Я пытаюсь построить систему комментариев и постов на django. Я хочу, чтобы при нажатии на отдельное сообщение для комментирования, сообщение было уже заполнено, а также request.user был уже заполнен, так что комментатору не нужно выбирать, какое сообщение он комментирует или выбирать, кто является комментатором. Я фактически добился этого, когда пользователь хочет сделать пост, его имя будет заполнено в поле author filed.
views.py:
@login_required(login_url="login")
def make_tweet_view(request):
author = request.user
form = make_tweet_form(initial={"author": author})
if request.method == "POST":
form = make_tweet_form(request.POST or None)
if form.is_valid():
form.save()
context= {'forms': form}
return render(request, "hometweet/make-tweet.html", context)
Но почему-то попытка не работает для моего просмотра комментариев
mycomment view:
def comment_view(request, id):
posts = Post.objects.get(id = id)
user = request.user
forms= comment_form(initial={"user": user, "posts":posts})
if request.method == "POST":
forms= comment_form(request.POST or None)
if forms.is_valid():
forms.save()
context = {"forms": forms}
return render(request, "hometweet/comment.html", context)
мои модели и их взаимоотношения:
class Post(models.Model):
content = models.TextField()
pics = models.ImageField(null= True, blank= True, upload_to= 'images/')
date_created = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name= "post_author")
def __str__(self):
return f"{self.content}"
class Coment(models.Model):
comment_post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name= "post_comments")
comment_author = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name= "comment_author")
comments = models.TextField()
comment_pics = models.ImageField(null= True, blank= True, upload_to= 'images/')
comment_date_created = models.DateTimeField(auto_now_add=True)
файл шаблона комментария:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>comment</title>
</head>
<body>
<form action="" method="POST">
{% csrf_token %}
{{forms.as_p}}
</form>
</body>
</html>
Предположим, что класс формы комментария выглядит примерно так:
# forms.py
from django.forms import ModelForm
from .models import Comment
class CommentForm(ModelForm):
class Meta:
model = Comment
fields = "__all__"
# this is equivalent to writing all model fields
# fields = ["comment_post", "comment_author", "comments", "comment_pics", "comment_date_created"]
Если вы хотите заполнить некоторые поля, то вы используете словарь, где ключ - имя поля, а значение - то, чем вы хотите заполнить поле формы:
# views.py
from .forms import CommentForm
# ...
def comment_view(request, id):
post = Post.objects.get(id=id)
user = request.user
form = CommentForm(initial={"comment_post": post, "comment_author": user})
# ...