我有模型(现实生活模型中的这个例子要大得多):
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来解决这个问题? 或者另一种(不是丑陋的)方式呢?
答案 0 :(得分:0)
听起来你想要一个内联表单集
“内联表单集是模型表单集之上的一个小抽象层。这简化了通过外键处理相关对象的情况。” https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets
OneToOneField
只是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