0

私はモデルを持っています(実際のモデルのこの例ははるかに大きいです):

class Ride(models.Model):
    account = models.ForeignKey(
        settings.AUTH_USER_MODEL, related_name='dives')
    date = models.DateField(blank=True, null=True)
    referenceA = models.ForeignKey(
        RefA,
        related_name="rides",
        blank=True,
        null=True
    ) 

    # in real life there is much more options and group of option
    optionA = models.FloatField(
        blank=True, null=True
    ) 
    optionB = models.FloatField(
        blank=True, null=True
    ) 

このモデルを次のように分割しました。

class Ride(models.Model):
    account = models.ForeignKey(
        settings.AUTH_USER_MODEL, related_name='dives')
    date = models.DateField(blank=True, null=True)
    referenceA = models.ForeignKey(
        RefA,
        related_name="rides",
        blank=True,
        null=True
    ) 
    ride_options = models.OneToOneField(
        RideOption
    ) 

class RideOption(models.Models):
    optionA = models.FloatField(
        blank=True, null=True
    ) 
    optionB = models.FloatField(
        blank=True, null=True
    )

ここで、関連するすべてのモデル インスタンス (RideOption など) を使用して Ride モデル インスタンスを編集するページを作成したいと考えています。モデルごとに ModelForm を使用することを好みますが、すべてをまとめて検証するにはどうすればよいでしょうか。この検証をビューで次のように記述できます。

ride_form = RideModelForm(...)
ride_option_form = RideOptionModelForm(...)
if ride_option_form.is_valid():
    if ride_form.is_valid():
        # now save

しかし、私にとっては本当に醜いもので、関連するモデルをたくさん持つことができます。

この検証と内部保存を非表示にする方法はありますか?

私は FormSet を見ましたが、私が理解しているように、それらは外部関係を持つモデルでのみ機能します。おそらく誰かがフォームセットでこれを解決する方法を知っていますか?
または、それを行う別の(醜くない)方法はありますか?

4

1 に答える 1

0

インラインフォームセットが必要なようです

「インライン フォームセットは、モデル フォームセットの上にある小さな抽象化レイヤーです。これらは、外部キーを介して関連オブジェクトを操作するケースを簡素化します。」 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets

AOneToOneFieldは単なる特殊なケースでForeignKeyあり、同じように機能するはずです。

例えば

# forms.py
from django.forms.models import inlineformset_factory

from .models import Ride, RideOption

RideFormSet = inlineformset_factory(Ride, RideOption, extra=0)


# views.py
from django.shortcuts import get_object_or_404

from .forms import RideFormSet
from .models import Ride

def myview(request, ride_id):
    ride = get_object_or_404(Ride, pk=ride_id)
    formset = RideFormSet(data=request.POST or None, instance=ride)
    if formset.is_valid():
        formset.save()
        # maybe redirect to success url here
    # else render template here
于 2013-09-24T12:37:20.867 に答える