我正在使用Django 2.0.6。我的文件夹结构是这样的:
mysite
mysite
polls
templates
polls
index.html
choice.html
请考虑所有其他文件都存在。我在这里没有提及他们。我设计了一个以“民意调查/问题/选择”格式的网址。这里的问题是我作为参数传递的变量。现在,我在models.py
中设计了一个Question类。from django.db import models
from datetime import timedelta
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def recent_publish(self):
return self.pub_date >= timezone.now() - 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
现在我在polls/urls.py
中指出了我的网址映射:
path('<str:ques>/choice/',views.choice,name='choice')
在视图文件中,我的选择功能就是这样
def choice(request,ques):
for q in Question.objects.all():
if q.question_text == ques:
break
return render(request,'polls/choice.html',{'q':q})
因此,我在此处将q作为Question类的对象传递给choice.html
现在这是choice.html
{% for e in q.choice_set.all() %}
<h1>{{e}}</h1>enter code here
这是我得到的错误
In template C:\Users\Nik\Desktop\mysite\polls\templates\polls\choice.html,
error at line 1
Could not parse the remainder: '()' from 'q.choice_set.all()'
1 {% for e in q.choice_set.all() %}
2 <h1>{{e}}</h1>
我的语法有误吗?
答案 0 :(得分:2)
模板不允许方法调用(并且绝对不允许使用参数)。这样做是有意的,以防止程序员在模板中编写业务逻辑。
您当然可以这样写:
{% for e in q.choice_set.all %}
...
{% endfor %}
由于Django模板会自动调用可调用对象(请注意,没有括号)。但我建议您在模型层上为此定义一些内容。
您可以通过在数据库级别执行以下操作来进一步增强搜索:
def choice(request,ques):
q = Question.objects.filter(question_text=ques).first()
return render(request,'polls/choice.html',{'q':q})