【发布时间】:2018-11-05 03:51:39
【问题描述】:
我从https://github.com/adandan01/mybook 获得了代码,代码运行良好,即使我已将其更新到 Django 2。这是一个非常简单的项目,用于在表单中添加一个人,并将他/她的亲属添加到内联表单中.一切正常,但是当我添加一个相对名称并忘记添加他的关系并提交表单时,不幸的是,该记录不会通过验证,但也不会给出错误消息。 Django 将忽略整个记录。例如,图像中 Hawra 的记录将不会被保存,Django 将删除它。对于这个简单的应用程序,只需填写两个字段(名称和关系),但我正在使用 8 个字段的应用程序,并且很难丢失数据。只要任何字段都有数据并要求用户填写所有必填字段,有什么方法可以让 django 在表单集/子表单中进行验证?
models.py:
class Profile(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
created_date = models.DateTimeField(default=timezone.now)
def get_absolute_url(self):
return reverse('profile-update', kwargs={'pk': self.pk})
def __unicode__(self):
return "%s %s" % (self.first_name, self.last_name)
class FamilyMember(models.Model):
profile = models.ForeignKey(Profile, on_delete=models.PROTECT)
name = models.CharField(max_length=100)
relationship = models.CharField(max_length=100)
form.py
class ProfileForm(ModelForm):
class Meta:
model = Profile
exclude = ()
class FamilyMemberForm(ModelForm):
class Meta:
model = FamilyMember
exclude = ()
FamilyMemberFormSet = inlineformset_factory(Profile, FamilyMember,
form=FamilyMemberForm, extra=1)
views.py
class ProfileCreate(CreateView):
model = Profile
fields = ['first_name', 'last_name']
class ProfileFamilyMemberCreate(CreateView):
model = Profile
fields = ['first_name', 'last_name']
success_url = reverse_lazy('profile-list')
def get_context_data(self, **kwargs):
data = super(ProfileFamilyMemberCreate, self).get_context_data(**kwargs)
if self.request.POST:
data['familymembers'] = FamilyMemberFormSet(self.request.POST)
else:
data['familymembers'] = FamilyMemberFormSet()
return data
def form_valid(self, form):
context = self.get_context_data()
familymembers = context['familymembers']
with transaction.atomic():
self.object = form.save()
if familymembers.is_valid():
familymembers.instance = self.object
familymembers.save()
return super(ProfileFamilyMemberCreate, self).form_valid(form)
【问题讨论】: