その6
記事の作成をトップページからできるようにしましょう。
入力フォームから何かを作る場合は、forms.pyを使用します。(commentでもやりましたね。ほとんど同じですよ!)
models.py
既存のPostモデルを使用するので、今回ここの変更はありません。
forms.py
新しく記事入力のフォームを作って、PostModelと繋げるため以下のように記述を追加します。
blog/forms.py
class PostForm(forms.ModelForm):
class Meta:
model = models.Post
fields = ('title', 'text',)
views.py
blog/views.py
def create_article(request):
form = forms.PostForm()
if request.method == "POST":
form = forms.PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect('blog:article', pk=post.id)
return render(request, 'blog/create_article.html', {
'form': form
})
#urls.py
blog/urls.py
path('article/create/', views.create_article, name='create_article'),
追加します。
create_article.html
新しく、記事の作成用のhtmlを作ります。
create_article.html
<html>
<head>
<!-- bootstrap -->
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
</head>
<body>
<div>
<a href="{% url 'blog:post_list' %}" class="btn btn-primary">HOMEへ戻る</a>
<hr>
<h1>記事の作成</h1><br>
<form method="post" action="">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
</div>
</body>
</html>
post_list.html
トップページ(post_list.html)に記事の作成ボタンを追加します。
post_list.html
<a href="{% url 'blog:create_article' %}">記事の作成</a>
確認
※Post.author" must be a "User" instance.
と言われてインスタンスがないなどと言われる場合があります。
これはユーザーがログアウトされた状態で記事を書き込もうとしているので、エラーになっているだけです。
localhost:8000/adminから一度ログインしてためしてみてください。
(この問題の永久的解決法はまたのちほど…)