#python #django
#python #django
Вопрос:
Введенные комментарии в форме не сохраняются в базе данных и нигде не отображаются. После нажатия кнопки сохранения он просто перенаправляется на другую страницу, и комментарии не отображаются. Я пытаюсь создать форму для ввода комментариев непосредственно со страницы сайта, я уже настроил ее с панели администрирования. Спасибо!
views.py
class BarbersPage(ListView):
model = Post
template_name = 'main/barbers.html'
context_object_name = 'posts'
def post_new(request):
post = get_object_or_404(Post)
if request.method == "POST":
form = CommentForm(request.POST)
if form.is_valid():
form.save()
return redirect('barbers')
else:
form = CommentForm()
return render(request, 'main/post_detail.html', {'form': form})
barbers.html
{% for post in posts %}
<img src="{{MEDIA_URL}}{{post.photo.url}}" width="800" />
<h3>
{{ post.name_barber}}
</h3>
<p>{{ post.description}}</p>
<h3> Comments.. </h3>
{% if not post.comments.all %}
no comments yet...<a href = "#">Add one</a>
{% else %}
{% for comment in post.comments.all %}
<strong>
{{ comment.name }}
{{ comment.add_date }}
</strong>
<p>{{comment.body }}</p>
{% endfor %}
{% endif %}
{% endfor %}
post_detail.html
<h1>New comment</h1>
<form method="POST" class="post-form">{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
urls.py
urlpatterns = [
path('',views.HomePage.as_view(),name='index'),
path('barbers/',views.BarbersPage.as_view(), name='barbers'),
path('post_detail/', views.post_new, name='post_detail'),
]
models.py
class Post(models.Model):
photo = models.ImageField(upload_to='media/photos/',null=True, blank=True)
name_barber = models.CharField(max_length=30, null=True, blank=True)
description = models.TextField(blank=True, null=True)
def __str__(self):
return self.description[:10]
class Comment(models.Model):
post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=30)
body = models.TextField(null=True)
add_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return '%s - %s' % (self.post, self.name)
forms.py
class CommentForm(ModelForm):
class Meta:
model = Comment
fields = ('name', 'body')
Ответ №1:
Строка
post = get_object_or_404(Post)
в вашем представлении функция post_new()
не кажется правильной.
Функция get_object_or_404()
должна получить некоторые параметры запроса для идентификации одного Post
экземпляра; обычно вы передаете PK или slug в качестве параметров функции.
Вы уверены, что при отправке вашей формы не возникает ошибок?
Кроме того, нигде, по вашему мнению, вы не привязываете свой новый комментарий к Post
объекту, поэтому, конечно post.comments.all
, он будет пустым в вашем шаблоне.
Ваш вид, вероятно, должен выглядеть примерно так:
def post_new(request, post_id):
post = get_object_or_404(Post, pk=post_id)
if request.method == "POST":
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.save()
return redirect('barbers')
...
соответствующим образом измените свои URL-адреса:
urlpatterns = [
...
path('post_detail/<int:post_id>/', views.post_new, name='post_detail'),
...
]
и не забудьте передать post_id
URL-адрес при отправке новой формы комментария.
Комментарии:
1. после изменения views.py я получаю сообщение об ошибке: ошибка типа в /post_detail/ post_new() отсутствует 1 требуемый позиционный аргумент: метод запроса ‘post_id’: GET
2. @Dire_straits ну да, вам нужно передать
post_id
URL и представление; код не может угадать, к какому сообщению вы хотите добавить комментарий.3. Спасибо, но как теперь я не могу открыть страницу post_detail. Как я могу написать код, чтобы форма ввода была включена barbers.html ?