使用Model Form的Generic_inlineformset_factory创建表单
我想用ModelForm来创建一个编辑表单。
我的模型之间有一种通用关系,所以如果有人能给我推荐一下视图和一些模板,我会非常感激,因为我对这门语言还很陌生。
我的模型大概是这样的:
class Employee(Person):
nickname = models.CharField(_('nickname'), max_length=25, null=True,
blank=True)
blood_type = models.CharField(_('blood group'), max_length=3, null=True,
blank=True, choices=BLOOD_TYPE_CHOICES)
marital_status = models.CharField(_('marital status'), max_length=1,
null=True, blank=True, choices=MARITAL_STATUS_CHOICES)
nationality = CountryField(_('nationality'), default='IN', null=True,
blank=True)
about = models.TextField(_('about'), blank=True, null=True)
dependent = models.ManyToManyField(Dependent,
through='DependentRelationship')
pan_card_number = models.CharField(_('PAN card number'), max_length=50,
blank=True, null=True)
policy_number = models.CharField(_('policy number'), max_length=50,
null=True, blank=True)
# code specific details
user = models.OneToOneField(User, blank=True, null=True,
verbose_name=_('user'))
class Person(models.Model):
"""Person model"""
title = models.CharField(_('title'), max_length=20, null=True, blank=True)
first_name = models.CharField(_('first name'), max_length=100)
middle_name = models.CharField(_('middle name'), max_length=100, null=True,
blank=True)
last_name = models.CharField(_('last name'), max_length=100, null=True,
blank=True)
suffix = models.CharField(_('suffix'), max_length=20, null=True,
blank=True)
slug = models.SlugField(_('slug'), max_length=50, unique=True)
class PhoneNumber(models.Model) :
phone_number = generic.GenericRelation('PhoneNumber')
email_address = generic.GenericRelation('EmailAddress')
address = generic.GenericRelation('Address')
date_of_birth = models.DateField(_('date of birth'), null=True, blank=True)
gender = models.CharField(_('gender'), max_length=1, null=True,
blank=True, choices=GENDER_CHOICES)
content_type = models.ForeignKey(ContentType,
如果有人能给我推荐一个链接之类的,那就太好了……
1 个回答
19
我来分享一下我找到的解决办法。在查看了Generic_inlineformset_factory的源代码后,我做了以下的视图:
def edit_contact(request):
c={}
profile = request.user.get_profile()
EmployeeFormSet = generic_inlineformset_factory(PhoneNumber,extra=0,can_delete=False)
EmployeeFormSet1=generic_inlineformset_factory(EmailAddress,extra=0,can_delete=False)
EmployeeFormSet2 = generic_inlineformset_factory(Address, extra = 0, can_delete=False)
if request.method == "POST":
p_formset = EmployeeFormSet(data=request.POST, instance = profile),
e_formset = EmployeeFormSet1(data=request.POST, instance = profile),
a_formset = EmployeeFormSet2(data=request.POST, instance = profile),
for e in p_formset:
if e.is_valid():
e.save()
for e in e_formset:
if e.is_valid():
e.save()
for e in a_formset:
if e.is_valid():
e.save()
return HttpResponseRedirect('/forms/sucess-edit/')
else:
p_formset = EmployeeFormSet(instance = profile),
e_formset = EmployeeFormSet1(instance = profile),
a_formset = EmployeeFormSet2(instance = profile),
c.update({'p_formset': p_formset, 'e_formset': e_formset,'a_formset': a_formset})
return render_to_response('forms/edit_contact.html',c,
context_instance=RequestContext(request))
这个方法成功运行了。我觉得这对那些在模型中使用了通用关系,并想要创建一个表单来编辑这些信息的人会很有帮助。