1

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

我有两张餐桌:

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?")

和这样的临时表:

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 表中,我希望能够添加多个记录,每个记录在特定时间都有一个 temp。例如:

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

为此,我希望能够呈现这样的表单来输入临时值:

Beans   [    ]
Sprouts [    ]
[save]

关于上述表格的一些说明:

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

因此,我需要在 Food 表中找到所有tracktemp设置为“True”的项目,并使用它向用户呈现一个表单,以便用户可以为那个时间添加一个临时工。

我怎样才能做到这一点?

4

1 回答 1

1

棘手的部分基本上是将 呈现为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

这里确实需要一个表单集,但需要注意的是:您需要向它传递一个稍微自定义的表单,该表单将您的新小部件用于 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
        }

好的,现在我们需要构建实际的表单集

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(....)

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

于 2012-12-28T14:32:58.073 回答