Как я могу позволить пользователям создавать свои собственные сообщения в Django?
Я пытаюсь создать дискуссионный форум с помощью Django. Сначала я сделал тестовый пост с помощью Django admin, но теперь хочу реализовать форму, чтобы любой пользователь мог написать пост. Идея заключается в том, чтобы на главной странице форума был список всех существующих сообщений, а нажатие на кнопку "Создать сообщение" приводило бы пользователя к форме сообщения, и после отправки он мог бы увидеть свое сообщение в списке. У меня есть готовый код для формы, и я думал, что правильно подключил его к URL, но при нажатии на кнопку "Создать сообщение" я получаю пустую страницу. Я новичок в Django, и мне нужна помощь в решении этой проблемы. Вот мои файлы:
Models.py:
class Category(models.Model):
name = models.CharField(max_length=20)
class Post(models.Model):
title = models.CharField(max_length=255)
author = models.CharField(max_length=60, default= 'None')
body = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
last_modified = models.DateTimeField(auto_now=True)
categories = models.ManyToManyField('Category', related_name='posts')
class Comment(models.Model):
author = models.CharField(max_length=60)
body = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
post = models.ForeignKey('Post', on_delete=models.CASCADE)
Forms.py:
class CommentForm(forms.Form):
author = forms.CharField(
max_length=60,
widget=forms.TextInput(attrs={
"class": "form-control",
"placeholder": "Your Name"
})
)
body = forms.CharField(widget=forms.Textarea(
attrs={
"class": "form-control",
"placeholder": "Leave a comment!"
})
)
class PostForm(forms.Form):
title = forms.CharField(
max_length=255,
widget=forms.TextInput(attrs={
"class": "form-control",
"placeholder": "Title"
})
)
author = forms.CharField(
max_length=60,
widget=forms.TextInput(attrs={
"class": "form-control",
"placeholder": "Your Name"
})
)
body = forms.CharField(widget=forms.Textarea(
attrs={
"class": "form-control",
"placeholder": "Leave a Post!"
})
)
Views.py:
def blog_index(request):
posts = Post.objects.all().order_by('-created_on')
context = {
"posts": posts,
}
return render(request, "blog_index.html", context)
def blog_category(request, category):
posts = Post.objects.filter(
categories__name__contains=category
).order_by(
'-created_on'
)
context = {
"category": category,
"posts": posts
}
return render(request, "blog_category.html", context)
def blog_detail(request, pk):
post = Post.objects.get(pk=pk)
form = CommentForm()
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = Comment(
author=form.cleaned_data["author"],
body=form.cleaned_data["body"],
post=post
)
comment.save()
comments = Comment.objects.filter(post=post)
context = {
"post": post,
"comments": comments,
"form":form,
}
return render(request, "blog_detail.html", context)
def blog_post(request):
post_form = PostForm()
if request.method == 'POST':
post_form = PostForm(request.POST)
if post_form.is_valid():
post = Post(
title=post_form.cleaned_data["title"],
author=post_form.cleaned_data["author"],
body=post_form.cleaned_data["body"],
)
post.save()
context = {
"post_form":post_form,
}
args= {}
args['post_form']= post_form
return render(request, "blog_post.html", args)
А вот URL-адреса:
urlpatterns = [
path("", views.blog_index, name="blog_index"),
path("<int:pk>/", views.blog_detail, name="blog_detail"),
path("<category>/", views.blog_category, name="blog_category"),
path("post_form/", views.blog_post, name="blog_post")
]
В заключение, вот html-файлы для индекса поста и формы поста (у меня также есть два других html-файла для детализации поста и категории поста, но я думаю, что они мне сейчас не нужны).
индекс форума html
{% extends "base.html" %}
{% block page_content %}
<div class="col-md-8 offset-md-2">
<h1>Blog Index</h1>
<hr>
{% for post in posts %}
<h2><a href="{% url 'blog_detail' post.pk%}">{{ post.title }}</a></h2>
<small>
{{ post.created_on.date }} |
Categories:
{% for category in post.categories.all %}
<a href="{% url 'blog_category' category.name %}">
{{ category.name }}
</a>
{% endfor %}
</small>
<p>{{ post.body | slice:":400" }}...</p>
{% endfor %}
<a class="btn btn-primary" href="{% url 'blog_post' %}" role="button">Create a Post</a>
</div>
{% endblock %}
Почтовая форма html
{% extends "base.html" %}
{% block page_content %}
<div class="col-md-8 offset-md-2">
<h3>Write your post:</h3>
<form action="/blog/" method="post">
{% csrf_token %}
<div class="form-group">
{{ post_form.title }}
</div>
<div class="form-group">
{{ post_form.author }}
</div>
<div class="form-group">
{{ post_form.body }}
</div>
<a button type="submit" class="btn btn-primary" href="{% url 'blog_index' %}" role="button">Submit</a>
</form>
{% endblock %}
Заранее благодарю за любой совет!
Попробуйте использовать
urlpatterns = [
path("", views.blog_index, name="blog_index"),
path("blog_detail/<int:pk>", views.blog_detail, name="blog_detail"),
path("blog_category/<str:category>", views.blog_category, name="blog_category"),
path("blog_post/", views.blog_post, name="blog_post")
]