1
resposta

Atributos dinâmicos no Form Class do Django

Tenho o seguinte trecho de código no meu django.form.py:

    class UsuariosModificarForm(forms.Form):
        username = forms.CharField(label='Username', max_length=10, widget=forms.TextInput(attrs={'value': user.username}))
        password = forms.CharField(required=False, label='Password', max_length=20, widget=forms.TextInput(attrs={'placeholder': user.password}))
        first_name = forms.CharField(label='Nome', max_length=50, widget=forms.TextInput(attrs={'value': user.first_name}))
        last_name = forms.CharField(label='Sobrenome', max_length=50, widget=forms.TextInput(attrs={'value': user.last_name}))
        email = forms.EmailField(label='E-mail', required=False, widget=forms.TextInput(attrs={'value': user.email}))
        admin = forms.BooleanField(label='Marque se o usuario for Administrador', required=False)

No caso queria criar um form modificador de dados que pega os dados antigos do usuário, exibe em html através do widget value. Entretanto, não sei como passar o atributo user para dentro da class UsuariosModificarForm pois a mesma não aceita nada além de forms.Form.

De gambiarra eu fiz o seguinte:

def modificar_form(user=None,request=None):
    class UsuariosModificarForm(forms.Form):
        username = forms.CharField(label='Username', max_length=10, widget=forms.TextInput(attrs={'value': user.username}))
        password = forms.CharField(required=False, label='Password', max_length=20, widget=forms.TextInput(attrs={'placeholder': user.password}))
        first_name = forms.CharField(label='Nome', max_length=50, widget=forms.TextInput(attrs={'value': user.first_name}))
        last_name = forms.CharField(label='Sobrenome', max_length=50, widget=forms.TextInput(attrs={'value': user.last_name}))
        email = forms.EmailField(label='E-mail', required=False, widget=forms.TextInput(attrs={'value': user.email}))
        admin = forms.BooleanField(label='Marque se o usuario for Administrador', required=False)
        if user == None: return UsuariosModificarForm(request)
        else: return UsuariosModificarForm()

E eu chamo a função modificar_form dentro da views.py:

Exemplo:

        if request.method == 'POST':
            form = modificar_form(request=request.POST)

Dá certo, porém achei meio "jeitinho" queria saber como fazer sem ter que dar esse contorno e se é possível pois sou iniciante no Django.

Um exemplo do que eu quero fazer é o próprio html do django.admin onde podemos visualizar as informações dos usuários e modificar de acordo com o que precisarmos.

1 resposta

Oi Marcelo, como vai? Espero que esteja bem ^-^

Sinto muito pela demora em obter um retorno.

Para esse caso em específico, você poderia utilizar um forms baseado no modelo (forms.ModelForm), indicando que o modelo é o user. Nesse link há um exemplo de como podemos fazer isso e também, nesta aula poderá ver na prática a implementação do código citado.

Qualquer dúvida estou por aqui.

Abraços e bons estudos!