2010-11-29 8 views
7

Quería crear un formulario de edición con la ayuda de ModelForm.Crear formulario usando Generic_inlineformset_factory del Formulario de modelo

y mis modelos contienen una relación genérica b/w clases, por lo que si alguien podría sugerirme la vista y un poco de plantilla para el propósito, estaría muy agradecido, ya que soy nuevo en el idioma.

Mis modelos se parecen: -

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, 

Si alguien me podría sugerir una relación más o menos. sería una gran ayuda ........

Respuesta

16

publicando la solución que descubrí. Después de echar un vistazo a la fuente de Generic_inlineformset_factory.

hice mi punto de vista como: -

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)) 

Esto funcionó con éxito, creo que sería una buena ayuda, el que está utilizando la relación genérica en su modelo, y quiero crear un formulario para la edición Esa información.

+0

Finalmente, un ejemplo de cómo usar generic_inline_formset_factory. ¡Esto realmente me ayudó! Gracias por publicar tu respuesta. – Brandon

Cuestiones relacionadas