1
resposta

Como utilizar Model Formset em Django

Tenho uma tabela Manytomany onde um candidato ao cadastrar o currículo poderá adicionar vários idiomas.

Como criar multiplos formulários quando o usuário clicar para adicionar um novo idioma?

...models.py

class Candidato(models.Model):

    '''
    modelo recebe candidatos, faz a relação de
    N:N entre as linguagem e idiomas
    '''
    TIPO_CURRICULO_CHOICES = (
        (1, 'Estagio Dev'),
        (2, 'Estagio Adm'),
        (3, 'Desenvolvedor'),
        (4, 'Gestor')
    )

    endereco = models.OneToOneField(
        Endereco,
        on_delete=models.CASCADE,
        primary_key=True
    )
    nome = models.CharField(max_length=50)
    cpf = models.CharField(max_length=14)
    link_github = models.URLField(max_length=100)
    pretencao_min = models.FloatField()
    pretencao_max = models.FloatField()
    tipo_curriculo = models.IntegerField(
        choices=TIPO_CURRICULO_CHOICES,
        default=1)
    telefone = models.CharField(max_length=15)
    email = models.EmailField(max_length=100)

    linguagens = models.ManyToManyField(
        Linguagem, through='CandidatoLinguagem'
    )

    idiomas = models.ManyToManyField(
        Idioma, through='CandidatoIdioma'
    )

    def __unicode__(self):
        return u"%s para %s" % (self.nome, self.get_tipo_curriculo_display())

class CandidatoLinguagem(models.Model):

    '''
    modelo uni o candidato as linguagens de programação
    e quantifica o tempo de desenvolvedor
    '''
    candidato = models.ForeignKey(Candidato)
    linguagem = models.ForeignKey(Linguagem)
    experiencia = models.DecimalField(max_digits=5, decimal_places=2)

    def __unicode__(self):
        return u"%s -> %s (%f)" % (
            self.candidato, self.linguagem, self.experiencia)


class CandidatoIdioma(models.Model):

    '''
    modelo uni o candidato aos idiomas falados
    e quantifica o nivel de conhecimento
    '''
    IDIOMAS_NIVEL_CHOICES = (
        (1, 'Iniciante'),
        (2, 'Basico'),
        (3, 'Medio'),
        (4, 'Avancado'),
        (5, 'Fluente')
    )
    candidato = models.ForeignKey(Candidato)
    idioma = models.ForeignKey(Idioma)
    nivel = models.IntegerField(
        choices=IDIOMAS_NIVEL_CHOICES,
        default=1)

    def __unicode__(self):
        return u"%s -> %s (%s)" % (
            self.candidato, self.idioma, self.get_nivel_display())
class CandidatoLinguagem(models.Model):

    '''
    modelo uni o candidato as linguagens de programação
    e quantifica o tempo de desenvolvedor
    '''
    candidato = models.ForeignKey(Candidato)
    linguagem = models.ForeignKey(Linguagem)
    experiencia = models.DecimalField(max_digits=5, decimal_places=2)

    def __unicode__(self):
        return u"%s -> %s (%f)" % (
            self.candidato, self.linguagem, self.experiencia)


class CandidatoIdioma(models.Model):

    '''
    modelo uni o candidato aos idiomas falados
    e quantifica o nivel de conhecimento
    '''
    IDIOMAS_NIVEL_CHOICES = (
        (1, 'Iniciante'),
        (2, 'Basico'),
        (3, 'Medio'),
        (4, 'Avancado'),
        (5, 'Fluente')
    )
    candidato = models.ForeignKey(Candidato)
    idioma = models.ForeignKey(Idioma)
    nivel = models.IntegerField(
        choices=IDIOMAS_NIVEL_CHOICES,
        default=1)

    def __unicode__(self):
        return u"%s -> %s (%s)" % (
            self.candidato, self.idioma, self.get_nivel_display())

...forms.py

class CandidatoLinguagem(models.Model):

    '''
    modelo uni o candidato as linguagens de programação
    e quantifica o tempo de desenvolvedor
    '''
    candidato = models.ForeignKey(Candidato)
    linguagem = models.ForeignKey(Linguagem)
    experiencia = models.DecimalField(max_digits=5, decimal_places=2)

    def __unicode__(self):
        return u"%s -> %s (%f)" % (
            self.candidato, self.linguagem, self.experiencia)


class CandidatoIdioma(models.Model):

    '''
    modelo uni o candidato aos idiomas falados
    e quantifica o nivel de conhecimento
    '''
    IDIOMAS_NIVEL_CHOICES = (
        (1, 'Iniciante'),
        (2, 'Basico'),
        (3, 'Medio'),
        (4, 'Avancado'),
        (5, 'Fluente')
    )
    candidato = models.ForeignKey(Candidato)
    idioma = models.ForeignKey(Idioma)
    nivel = models.IntegerField(
        choices=IDIOMAS_NIVEL_CHOICES,
        default=1)

    def __unicode__(self):
        return u"%s -> %s (%s)" % (
            self.candidato, self.idioma, self.get_nivel_display())

class CandidatoForm(forms.ModelForm):

    class Meta:
        model = Candidato
        exclude = ['endereco']

...template.html

{% extends 'curriculo/base.html' %}
{% block content %}

<form class="form-horizontal" method="POST">
{% csrf_token %}
<fieldset>
    <legend><h1>Dados Pessoais</h1></legend>
        {{ form_candidato.as_p }}
  </fieldset>
<br/><br/><br/>
<button type="submit" class="btn btn-primary btn-lg btn-block">
Enviar
</button>
<br/>
 </form>
{% endblock content %}

É extremamente dificil achar material sobre Django e realmente necessito desta ajuda U_U

1 resposta

Oi Gabriel. Acho que teve uma pessoa com o mesmo problema aqui:

http://stackoverflow.com/questions/2216974/django-modelform-for-many-to-many-fields