1

テーブルのデータに基づいてフォームを表示する方法を見つけようとしています。基本的に、あるテーブルのデータをラベルとして使用して、別のテーブルにデータを入力したいと考えています。

私は2つのフードテーブルを持っています:

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)

テーブルには 2 つの食品Food(Beans、Sprouts) があり、それぞれにtracktemp設定されTrueています。

一時テーブルでは、複数のレコードを追加できるようにしたいと考えています。各レコードには、特定の時間に単一の一時があります。例えば:

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

これを行うには、次のようなフォームをレンダリングして一時的に入力できるようにしたいと考えています。

Beans   [    ]
Sprouts [    ]
[save]

上記のフォームに関する注意事項:

  • 食品名は、コンボ ボックスではなく、ラベルにする必要があります。
  • 日付/時刻フィールドは表示せず、プログラムで設定するだけです。

そのため、「True」に設定されている Food テーブル内のすべての項目を見つけて、tracktempそれを使用してユーザーにフォームを表示し、ユーザーがその時間の一時を追加できるようにする必要があります。

これどうやってするの?

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 に答える