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,但据我所知,它们仅适用于具有对外关系的模型。也许有人知道如何用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 回答