【问题标题】:Django Inline form validation ignored partly filled formDjango Inline 表单验证忽略了部分填充的表单
【发布时间】: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)

【问题讨论】:

    标签: python django


    【解决方案1】:

    我在这里找到了解决方案django inline_formset - form.empty_permitted = False doesn't work

    我必须在创建和更新类中的 if (familymembers.is_valid():...) 之前添加以下代码,因此,如果我仅在 Name 字段中输入数据,Django 将显示错误并告诉我的关系字段是必需的。

    if familymembers.is_valid() == False:
       return self.render_to_response(self.get_context_data(form=form,familymembers=familymembers ))
    

    【讨论】:

      猜你喜欢
      • 2011-02-17
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      相关资源
      最近更新 更多