2016-12-31 312 views
0

我是Django框架的新手,似乎无法确定为什么我的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