0

私はDjango Frameworkを初めて使用しているので、detail.htmlが正しくレンダリングされない理由を特定できないようです。私のforloopが問題の選択肢を反復するかのように見えます.choice_set.allはヒットしていません。誰かがなぜそれが非常に役に立つのかを特定するのを助けることができたら。Djangoチュートリアル:.choice_set.allが呼び出されない

detail.html

<h1>{{ question.question_text }}</h1> 

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{%  endif %} 

<form action="{% url 'polls:vote' question.id %}" method="post"> 
{% csrf_token %} 

{% for choice in question.choice_set.all %} 
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}  

</label><br /> 

<input type="radio" name="choice" id="choice{{ forloop.counter }}" 
value="{{ choice.id }}" /> 
{% endfor %} 


<input type="submit" value="Vote" /> 
</form> 

Views.py

from django.http import HttpResponseRedirect, HttpResponse 
from django.template import loader 
from django.urls import reverse 
from django.shortcuts import get_object_or_404, render 

from .models import Choice, Question 

# Long Method of return HttpResponse 
# def index(request): 
#  latest_question_list = Question.objects.order_by('-pub_date')[:5] 
#  template = loader.get_template('polls/index.html') 
#  context = { 
#   'latest_question_list': latest_question_list, 
#  } 

def index(request): 
    latest_question_list = Question.objects.order_by('pub_date')[:5] 
    context = {'latest_question_list': latest_question_list} 
    return render(request, 'polls/index.html', context) 
    # render takes the request (object,template,dictionary<optional>) 


# def detail(request, question_id): 
#  try: 
#   question = Question.objects.get(pk=question_id) 
#  except Question.DoesNotExist: 
#   raise Http404("Question does not exist") 
#  return render(request, 'polls/detail.html', {'question': question}) 

# SHORTCUT TO USE GET AND RASIE 404 
def detail(request, question_id): 
    question = get_object_or_404(Question, pk=question_id) 
    return render(request, 'polls/detail.html', {'question': question}) 




def results(request, question_id): 
    question = get_object_or_404(Question, pk=question_id) 
    return render(request, 'polls/results.html', {'question': question}) 

def vote(request, question_id): 
    question = get_object_or_404(Question, pk=question_id) 
    try: 
     selected_choice = question.choice_set.get(pk=request.POST['choice']) 
    except (KeyError, Choice.DoesNotExist): 
     # Redisplay the question voting form. 
     return render(request, 'polls/detail.html', { 
      'question': question, 
      'error_message': "You didn't select a choice.", 
     }) 
    else: 
     selected_choice.votes += 1 
     selected_choice.save() 
     # Always return an HttpResponseRedirect after successfully dealing 
     # with POST data. This prevents data from being posted twice if a 
     # user hits the Back button. 
     return HttpResponseRedirect(reverse('polls:results', args=(question.id,))) 

urls.py

# map views to url 
from django.conf.urls import url 
from django.conf.urls import include 

from . import views 

app_name = 'polls' 

urlpatterns = [ 
    #ex: polls/ 
    url(r'^$', views.index, name='index'), 

    #ex: /polls/5/ 
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), 

    #ex: /polls/5//results/ 
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), 

    #ex: /polls/5/vote 
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), 
] 

**ここに私のデータモデル** model.py

です
# Pythons Imports for built in modules 
import datetime 



from django.db import models 

from django.utils import timezone 


class Question(models.Model): 
    question_text = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 
    #string method for question object representation 
    def __str__(self): 
     return self.question_text 

    def was_published_recently(self): 
     return self.pub_date >= timezone.now() - datetime.timedelta(days=1) 



class Choice(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 
    def __str__(self): 
     return self.choice_text 

# Running python manage.py makemigrations polls instructs django of 
# changes to your model 
+0

お問い合わせください。 – Bobby

+0

自分のモデルをエラーにも追加しました。私の出力は、Forloopで "あなたは選択肢を選択していませんでした"ということを続けています。 – user3728367

+0

私の答えは以下のとおりです。 choice_setはテンプレート内で完全に有効です。回避策もうまくいきます。私は今何が問題を引き起こしたのかよく分かりません。 – Bobby

答えて

-1

回避策として、すべての相対情報を取得して辞書を生成する関数をquestionモデルに追加できます。辞書を通すと、テンプレートから情報にアクセスできます。

これは

models.py学生のクラスの下に私のプロジェクトの小さな例です

def get_homework(self): 
    '''get all homeworks of classes related to this student''' 
    dict = {} 
    dict['notification'] = False 
    dict['content'] = {} 
    for my_class in self.related_class.all(): 
     homework_list = [] 
     for class_homework in my_class.related_homework.filter(due_date__gte=date.today()): 
      if class_homework.due_date == date.today(): 
       dict['notification'] = True 
      homework = {} 
      homework['name_chinese'] = class_homework.name_chinese 
      homework['assigned_by'] = class_homework.assigned_by 
      homework['homework_content'] = class_homework.homework_content 
      homework['assign_date'] = class_homework.assign_date 
      homework['due_date'] = class_homework.due_date 
      homework['submission'] = class_homework.submission 
      homework_list.append(homework) 
     dict['content'][my_class.name_chinese] = homework_list 
    return dict 

views.py

dict = student.get_homework() 
return render(request,'ParentHomework.html',dict) 
+0

申し訳ありませんが、これは間違っています。そのコードはテンプレート内で完全に有効です。 –

+0

@DanielRosemanあなたは正しいです。私は自分自身とそのうまくいったことを試みました。私は削除する必要がありますか?テンプレートロジックでクエリを実行するのは直感的ではないようです。 – Bobby

関連する問題