如何根据表中的数据在Django表单上显示项目?

时间:2012-12-28 00:16:43

标签: python django django-models django-forms

我试图弄清楚如何根据表中的数据显示表单。我基本上想要使用一个表中的数据作为标签来输入进入另一个表的数据。

我有两张食物桌:

class FoodType(models.Model):
  name = models.CharField(max_length=200)

class Food(models.Model):
  foodtype = models.ForeignKey(FoodType)
  tracktemp = models.BooleanField(verbose_name="Track Temperature?")

和这样的Temp表:

class Temp(models.Model):
  date = models.DateField('Entry Date')
  time = models.TimeField('Entry Time')
  food = models.ForeignKey(Food)
  temp = models.IntegerField(max_length=4, blank=True, null=True)

我的Food表中有两种食物(豆类,豆芽),tracktemp每种食物都设置为True

在Temp表中,我希望能够添加多条记录,每条记录在特定时间都有一个临时值。例如:

Beans  1st Dec 2012 6.00pm     230
Beans  1st Dec 2012 6.04pm     235
Beans  1st Dec 2012 6.10pm     240

要做到这一点,我希望能够渲染这样的表格来输入temps:

Beans   [    ]
Sprouts [    ]
[save]

关于上述形式的一些注释:

  • 食物名称应该是标签,而不是组合框。
  • 我不会显示日期/时间字段,只是以编程方式设置它们。

因此我需要在Food表中找到tracktemp设置为'True'的所有项目,并使用它向用户显示表单,以便用户可以添加该时间的临时值。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

棘手的部分基本上是将Temp.food渲染为其他东西 而不是选择小部件(这是ForeignKey关系的默认小部件)。

为此,您必须继承Select窗口小部件并覆盖render方法 仅输出具有所选值的标签

from django.forms.widgets import Select

class MyLabelSelect(Select):
    def render(self, name, value, attrs=None, choices=()):
        # read the django.forms.widgets.Select.render() source to 
        # understand what you have to do here. Not that hard.
        pass

一个formset确实是你需要的,但需要注意:你需要传递它 一个稍微自定义的表单,它将您的新窗口小部件用于FK关系。

from django import forms
from .widgets import MyLabelSelect
from .models import Temp

class TempForm(forms.ModelForm):
    class Meta:
        model = Temp
        exclude = ('date', 'time')
        widgets = {
            'food': MyLabelSelect
        }

现在我们需要构建实际的formset

from django.forms.models import modelformset_factory
from .forms import TempForm
from .models import Temp

def my_view(request):
    TempFormset = modelformset_factory(
        Temp,
        form = TempForm,
        max_num = Temp.objects.count()
    )

    if request.method == 'POST' and request.POST:
        # I'll just demonstrate the GET request
        pass
    else:
        # Grab the Temp objects we want
        temps = Temp.objects.filter(food__tracktemp=True)
        temp_formset = TempFormset(
            queryset=temps 
        )
    return render_to_response(....)

实际上没有测试过上面的代码,但这些内容是什么 你在追求。如果我有任何明显的错误告诉我,我会纠正它们。