ランダムおすすめ記事

ホームページ作りました

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

いいねボタンを押すとページの一番上に戻ってしまう!!!!

ページを遷移させないっていうのはJavaScriptの知識がいるらしくなかなか難しそう・・・。
ですがせめて同じ場所に遷移できないか?というわけでやってみました。

いいねボタンを押した後の遷移について

散々調べましたが結局質問しました。だって分からないんだもの。
そしたら結局java scriptを使いました。
それがこれ。

<script>
  {% if next %}
      window.location.href += '#{{ next }}';
  {% endif %}
</script>



htmlのどこかに

id="{{ post.pk }}"

を置いておくとそこにリダイレクトするみたい。
リンクしたあとにプライマリーキーを保持するって認識でいいのかな?java scriptは勉強してないのでよくわからないですが・・・。
ただ幸いにもあとはpythonの領域だったので理解できました。

まずいいねボタンのリダイレクト先を変更します。

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)



return redirect('board:index', next=pk)

のリダイレクト先のurlを作成します。

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

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)

ちなみにcontextで

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

をcontextで送信してあげないとindexページにはテキストと送信ボタンしか表示されません。

next=None

は何となくしかわからないです。でもこれがないとurlのプライマリーキーの受渡しはうまくいかないはず・・・。
聞いたものをさらに改造する必要があったのでさんざん苦労しました・・・。簡単そうに書いてますけど。


がしかし!!!!
f:id:sr2460:20190201103135p:plain

listviewで以下のコードを使って投稿日時の新しいものが上にくるようにしていたんですがdef indexでページを表示しているのでこのロジックは反映されておらず古いものが一番上になってしまいました。

class ListView(generic.ListView):
    model = Post

    def get_queryset(self):
        return Post.objects.order_by('-date')


で解決方法がこれ!
この部分を

post_list = Post.objects.all()

こう書き換え

post_list = Post.objects.order_by('-date')



考えてみれば当たり前ですねこれ。

が、しかしまたしても問題が・・・。 いいねで遷移したページ。つまり

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)

このページでコメントフォームを送信すると送信自体は出来るのですが、投稿したコメントがフォームに残ったままになってしまいます。
本来

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


redirct

にして遷移するのでそう書き換えればいいのですがそうするとURLにいいねボタンのid情報が含まれなくなってしまいますのでいいねボタンを押してもページの一番上に遷移してしまうんですよね。

ちなみに

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


と書き換えてみたらform消えないかなと思いましたが消えたのは投稿されたコメントでした。 まあコード見ればすぐわかりますよねこれ・・・。 つまりrenderでページを遷移した後にフォームに残存したコメントを消すってことか・・・。それはさすがに無理があるような・・・。
これは解決するまで保留。致命的なミスじゃないんでこのまま実際に運用を始めるかもしれません。

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

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

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

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

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

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

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

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

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

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

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