我试图弄清楚如何根据表中的数据显示表单。我基本上想要使用一个表中的数据作为标签来输入进入另一个表的数据。
我有两张食物桌:
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'的所有项目,并使用它向用户显示表单,以便用户可以添加该时间的临时值。
我该怎么做?
答案 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(....)
实际上没有测试过上面的代码,但这些内容是什么 你在追求。如果我有任何明显的错误告诉我,我会纠正它们。