5

これらのモデルがあり、データに基づいてフォームを作成したい:

class Location(models.Model):
    name=models.CharField(max_length=255)
    location_id=models.CharField(max_length=255)
    organization=models.CharField(max_length=255)

    def __unicode__(self):
        return self.name

class Beverage(models.Model):
    name=models.CharField(max_length=255)
    location=models.ForeignKey(Location)
    fill_to_standard=models.IntegerField(max_length=10)
    order_when_below=models.IntegerField(max_length=10)

    def __unicode__(self):
        return self.name

class Inventory(models.Model):
    location=models.ForeignKey(Location)
    beverage=models.ForeignKey(Beverage)
    units_reported=models.IntegerField(max_length=10)
    timestamp=models.DateTimeField(auto_now=True)

ユーザーが特定の場所の在庫を更新するときに、その場所で使用可能なすべての飲料を一覧表示するフォームを取得し (飲料は場所によって異なります)、次のInventoryフォームを作成します。そのためInventory、それぞれのテーブルに新しい行を作成します。履歴を持つことができるように、それぞれにタイムスタンプが必要です。フォームセットが必要だと思いますが、これを実装する方法を理解することに成功していません。したがって、これは一種の 2 部構成です。BeverageLocation

  1. 私のモデル設計はこの問題に適していますか?
  2. 飲み物の数に依存するフォームを自分で作成するにはどうすればよいですか?
4

1 に答える 1

3

質問 1: モデル設計 - 場所フィールドは既に飲料モデルにあり、冗長であるため、在庫モデルから削除します。そうでなければ、彼らは私には似合います。

質問 2: フォームセット...

フォーム.py

from django import forms
from my_project.my_app.models import Beverage

class InventoryForm(forms.ModelForm):
    units_reported = forms.IntegerField()
    class Meta:
        model = Beverage
        fields = ('name', 'id')

ビュー.py

from django.forms.models import modelformset_factory
from my_project.my_app.models import Beverage, Inventory

def update_inventory(request, location_id):

    InventoryFormSet = modelformset_factory(Beverage, form=InventoryForm)
    qs = Beverage.objects.filter(location=location_id)
    formset = InventoryFormSet(queryset=qs)
    if request.method == 'POST':
        formset = InventoryFormSet(request.POST)
        if formset.is_valid():
            for form in formset:
                beverage = form.save(commit=False)
                units_reported = form.cleaned_data['units_reported']
                Inventory(beverage=beverage, units_reported=units_reported).save()
    ...

modelformset_factory は、クエリセット内のすべてのオブジェクト (飲料) のフォームを作成します。このフォームは、目的の場所でフィルター処理され、カスタマイズされた ModelForm にユニットをレポートするための追加フィールドがあります。

于 2012-05-14T08:43:18.640 に答える