ランダムおすすめ記事

ホームページ作りました

python、djangoで掲示板を作ってみたい⑩

シリーズ⑨とかになってますが開発期間自体は前回の投票アプリケーションの方がよほど長いです。
こっちは少しプログラミングへの理解が進んでブログを書きながら開発する余裕ができたのさ!!!
前回管理画面で画像なしでコメントなど編集するとエラーが出ると話しましたけどこれは秒速で解決しました!!

file = models.FileField('ファイル', null=True, blank=True)

blank= Trueを配置したら直りました。

このFileFieldのTrueって管理画面の話なのかな??? 結局フォーム側は

    file = forms.FileField(
        label='',
        required = False,
    )

required = False,にすることで画像を添付しなくても送信できるようにしてるんだよな・・・。
必須=じゃなくていい
ってことだから多分フォーム側で画像の要不要を操作しなきゃいかんのだろうな。

JavaScriptを学ぶ必要があるんだと思う

続いて、いいねボタンを押した後のページの問題。
遷移した後の問題として
①遷移後のページでコメントフォームを使うと送信はできるがコメントは残ってしまう。
②ページネーションが表示されない

②に関してそれっぽい資料を見つける。
Django、ページング処理まとめ | NARITO BLOG

成人先生ブログ。

def paginate_queryset(request, queryset, count):
    """Pageオブジェクトを返す。

    ページングしたい場合に利用してください。

    countは、1ページに表示する件数です。
    返却するPgaeオブジェクトは、以下のような感じで使えます。

        {% if page_obj.has_previous %}
          <a href="?page={{ page_obj.previous_page_number }}">Prev</a>
        {% endif %}

    また、page_obj.object_list で、count件数分の絞り込まれたquerysetが取得できます。

    """
    paginator = Paginator(queryset, count)
    page = request.GET.get('page')
    try:
        page_obj = paginator.page(page)
    except PageNotAnInteger:
        page_obj = paginator.page(1)
    except EmptyPage:
        page_obj = paginator.page(paginator.num_pages)
    return page_obj

これは普通にコピペ。

続いてdef indexを改造する。

def index(request, next=None):
    form = PostForm(request.POST or None)
    question = Question.objects.all()
    post_list = Post.objects.all()

    context = {
            'next': next,
            'question': question,
            'post_list': post_list,
            'form': form,
    }

    if request.method == 'POST' and form.is_valid():
        form.save()
    return render(request, 'board/board.html', context)



改造後


def index(request, next=None):
    form = PostForm(request.POST or None)
    question = Question.objects.all()
    post_list = Post.objects.all()
    page_obj = paginate_queryset(request, post_list, 15)

    context = {
            'next': next,
            'question': question,
            'post_list': page_obj.object_list,
            'page_obj': page_obj,
            'form': form,
    }

    if request.method == 'POST' and form.is_valid():
        form.save()
    return render(request, 'board/board.html', context)



EmptyPage at /board/good/53/
このページには結果が含まれていません。


ん!!??んんんんんんんん!!!???
こんなエラー見たことないな・・・。これ解決・・・いや、う~~~ん。


・・・。 いやこれってそもそも・・・。

一回問題を整理しよう。
そもそも論としてこんなことになっているのはいいねボタンを押したときにページ遷移をさせたいというところから来ています。
そのために

def good(request, pk):
    """いいねボタンをクリック."""
    post = get_object_or_404(Post, pk=pk)
    if request.method == 'POST':
        # データの新規追加
        post.good += 1
        post.save()
    return redirect('board:index', next=pk)


ページにnext=pkを加え、一度

    path('good/<int:next>/', views.index, name='index'),

ここに飛び、さらに

def index(request, next=None):
    form = PostForm(request.POST or None)
    question = Question.objects.all()
    post_list = Post.objects.all()

    context = {
            'next': next,
            'question': question,
            'post_list': post_list,
            'form': form,
    }

    if request.method == 'POST' and form.is_valid():
        form.save()
    return render(request, 'board/board.html', context)


でリストビューではなくindex関数でborard.htmlを見られるようにしています。 ただしいいねボタンから遷移するページURLは

http://localhost:8000/board/good/53/#53

のような形となり、汎用ビューであるListViewで作られる

http://localhost:8000/board/

は使えないです。いいねボタンを押した後に

good/53/

に遷移。普通ならそこから

def good(request):
    """いいねボタンをクリック."""
    post = get_object_or_404(Post, pk=pk)
    if request.method == 'POST':
        # データの新規追加
        post.good += 1
        post.save()
    return redirect('board:board)

でリダイレクトさせればいいだけなんですけれど、いいねボタンを押した後に同じ場所に遷移させたいがために、

def good(request, pk):
~(中略)~
return redirect('board:board, next=pk)
    path('good/<int:next>/', views.index, name='index'),

と遷移させURLを保持することでいいねボタンを押した後のページ遷移を可能にしているからなんですよね。

このページでフォームを送信する場合

def index(request, next=None):
    form = PostForm(request.POST or None)
    question = Question.objects.all()
    post_list = Post.objects.all()

    if request.method == 'POST' and form.is_valid():
        form.save()
       
    context = {
            'next': next,
            'question': question,
            'post_list': post_list,
            'form': form,
    }

    return render(request, 'board/board.html', context)

このコードだと送信フォームに文章が残存してしまい

form.saveの下に

 return redirect('board:board')

と置くと今度はフォームを送信した後にredirextに#53の数字が残ってしまいページ途中に遷移してしまいます。

ここに関してはアドバイスを受けていて

画面操作をJavaScriptで、サーバー操作をJavaScriptからAjax通して行ったら一通り解決しそう

Ajaxというものを調べたところ はじめてのAjax(jQuery) 2018年版 - Qiita


ページ遷移をさせず(非同期処理で)コンテンツを書き換えられる 他の処理と同時並行で、サーバとやりとりができる


ページを遷移させなかったら今起きている問題全部解決できるよねぇ・・・。

・・・。 3日くらい試行錯誤してみましたがどうしてもうまくいきませんでした。 なのでいつかJavaScriptを勉強して修正するということに決めました!
いつか修正する(つもり)です!!!

というわけで未完成ながらサイトを完成。ああ。もっと色々勉強しなきゃなあ。

http://160.16.55.98/board/

python、djangoで掲示板を作ってみたい① - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい② - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい③ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい④ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑤ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑥ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑦ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑧ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑨ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑩ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑪ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定