前提・実現したいこと
簡易的なお題に回答を投稿できる大喜利サイトを作っている途中にデータベースがうまく読み込めておらず、表示されない問題が発生してしまった。
###発生している問題
投稿画面から回答を投稿することはでき、データベースにも反映されておりすぐに投票画面に移行しても回答が表示されていない
参考画像
もう一度runserverを行い、投票画面に移行すると下の画像のように正常に表示される
views.py
@login_required def answer_view(request): id = Oogiri_home.objects.order_by('-created_at').first() question = get_object_or_404(Oogiri_home, pk=id.id) if request.method == 'POST': form = AnswerForm(request.POST) if form.is_valid(): post = form.save(commit=False) post.user = request.user post.title = question post.save() return redirect('oogiri_home:index') else: form = AnswerForm() context = {'question': question, 'form': form} return render(request, 'answer_create.html', context,) @login_required def vote_view(request): id = Oogiri_home.objects.order_by('-created_at').first() question = get_object_or_404(Oogiri_home, pk=id.id) if request.method == 'POST': form = VoteForm(request.POST) form.user = request.user if form.is_valid(): form.save() return redirect('oogiri_home:result', id=id.id) else: form = VoteForm() context = {'question': question, 'form': form} return render(request, 'vote.html', context,)
###forms.py
class AnswerForm(forms.ModelForm): class Meta: model = Oogiri_user fields = ('answer',) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields.values(): field.widget.attrs['class'] = 'form-control' class VoteForm(forms.Form): id = Oogiri_home.objects.order_by('-created_at').first() if id: CHOICES = [(ch.id, ch.answer) for ch in Oogiri_user.objects.filter(title_id=id.id)] your_choice = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect()) def save(self): choice_id = self.cleaned_data.get('your_choice') selected_choice = Oogiri_user.objects.get(pk=choice_id) selected_choice.score += 1 selected_choice.save()
###追記(vote.html)
{% block header%} <header class="masthead text-center text-white"> <div class="masthead-content"> <div class="container"> <p>お題</p> <h1 class="masthead-heading mb-0"> {{ question.title }} </h1> <h3 class="post-subtitle"> 作成者{{ question.user }} </h3> </div> </div> </header> {% endblock %} {% block contents %} <div class="container"> <div class="row"> <div class="my-div-style w-100"> <form action="{% url 'oogiri_home:vote' %}" method="post"> {% csrf_token %} {{ form.as_p }} <button class="btn btn-primary" type="submit">投票</button> </form> </div> </div> </div> {% endblock %}
補足情報
コードの量が多いので追加したほうが良いコードがありましたら、コメントよろしくお願いします。
###新たな発見
views.pyのvote_viewに
CHOICES = [(ch.id, ch.answer) for ch in Oogiri_user.objects.filter(title_id=id.id)]
を追加しvote.htmlにも
{{ choice }}
あなたの回答
tips
プレビュー