如何将类变量获取到Django模板

时间:2015-08-26 08:27:10

标签: python django django-models django-templates

我刚开始创建Django应用程序。我在models.py中有一个类,它有一个类变量CATEGORY_CHOICES,其中包含选项字段的值。

#models.py
from django.db import models
from django.utils import timezone

class Entry(models.Model):

    CATEGORY_CHOICES = (
        ('c1','choice 1'),
        ('c2','choice 2'),
        ('c3','choice 3'),
        ('c4','choice 4'),
    )

    date = models.DateField(default=timezone.now)
    time = models.TimeField(default=timezone.now)
    category = models.CharField(choices=CATEGORY_CHOICES,blank=False,null=False,max_length=2)
    value = models.TextField()

我想为类Entry的creting instanes创建表单。我对select菜单有疑问,我想在CATEGORY_CHOICES放置值,但我无法弄清楚如何。

<!-- homepage.html -->
{% load staticfiles %}
{% load app_filters %}

<HTML>

    <HEAD>

        <TITLE>Website title</TITLE>
        <link rel="stylesheet" href="{% static "css/app.css" %}">

    </HEAD>

    <BODY>

        <form method="POST" class="form-inline">{% csrf_token %}
            <input type="date" class="form-control" id="date-input">
            <input type="time" class="form-control" id="time-input">
            <select class="form-control">
            {% for choice in Entry.CATEGORY_CHOICES %}
              <option>{{ choice|get_at_index:1 }}</option>
            {% endfor %}
            </select>
            <input type="text" class="form-control" id="value-input" placeholder="Value">
            <input type="submit" value="OK">
        </form>

    </BODY>

</HTML>

这是一个4元素列表,因此{% for choice in Entry.CATEGORY_CHOICES %}应该将单个2元素列表(第一个('c1','choice 1')然后('c2','choice 2')等)保存到变量choice中。在那里,我使用自定义过滤器get_at_index帮助选择列表的第二个元素。

#app_filters.py
from django import template

register = template.Library()

@register.filter(name='get_at_index')
def get_at_index(list, index):
    return list[index]

我没有错误,但在最终形式中,选择菜单中没有选项。 enter image description here

可能有什么问题以及如何解决?

#views.py
from django.shortcuts import render
from .forms import EntryForm

def home_page(request):
    form = EntryForm()
    return render(request, 'app/homepage.html', {'form':form})

forms.py

#forms.py
from django import forms
from .models import Entry

class EntryForm(forms.ModelForm):

    class Meta:
        model = Entry
        fields = ('date','time','category','value',)

1 个答案:

答案 0 :(得分:1)

在您看来,您已将表单传递给模板,但您不能按照自己的方式在模板中使用该表单。要使用您传递过的表单,请在模板中编写您的表单代码,如下所示:

<form method="POST" class="form-inline">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="OK">
</form>

它将为您呈现整个表单。您可以在官方文档中了解更多相关信息:Building a form in Django

或者,如果您想自己构建表单,则需要在您的视图中将Coices发送到您的模板:

def home_page(request):
    form = EntryForm()
    return render(request, 'app/homepage.html', {
       'form': form,
       'entry_choices': Entry.CATEGORY_CHOICES
    })

然后使用密钥 entry_choices 在模板中访问它。