【问题标题】:How can I display items on Django form based on data in a table?如何根据表格中的数据在 Django 表单上显示项目?
【发布时间】:2012-12-28 00:16:42
【问题描述】:

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

我有两张餐桌:

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”的项目,并使用它向用户呈现一个表单,以便用户可以添加一个临时的时间。

我该怎么做?

【问题讨论】:

  • 你试过什么?这听起来像是一个你已经完成零研究的家庭作业问题,因为即使是对 Django 查询集的初步研究也会给你所需的答案。
  • 这不是家庭作业问题。这是我正在进行的一个项目的一部分。我首先尝试运行查询以从 Food 中获取项目,然后迭代并生成一个表单。我无法让这些项目进行迭代。然后我尝试了一个表单集,但我有点困惑我是在食品还是温度上运行表单集。

标签: python django django-models django-forms


【解决方案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(....)

还没有实际测试过上面的代码,但是类似的东西是什么 你在追求。如果我有任何明显的错误,请告诉我,我会纠正它们。

【讨论】:

    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2018-05-30
    相关资源
    最近更新 更多