Django views.py文件参数传递

时间:2018-07-01 10:07:19

标签: django

我正在使用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>

我的语法有误吗?

1 个答案:

答案 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})