Saltar al contenido

Django Forms: pasar parámetro al formulario

Te sugerimos que revises esta resolución en un ambiente controlado antes de enviarlo a producción, saludos.

Solución:

Debes definir el método __init__ de tu formulario, así:

class StylesForm(forms.Form):
    def __init__(self,*args,**kwargs):
        self.site_id = kwargs.pop('site_id')
        super(StylesForm,self).__init__(*args,**kwargs)

por supuesto, no puede acceder a self.site_id hasta que se haya creado el objeto, por lo que la línea:

     height = forms.CharField(widget=forms.TextInput(attrs='size':site_id))

no tiene sentido. Tienes que agregar el attribute al widget después de que se haya creado el formulario. Prueba algo como esto:

class StylesForm(forms.Form):
    def __init__(self,*args,**kwargs):
        self.site_id = kwargs.pop('site_id')
        super(StylesForm,self).__init__(*args,**kwargs)
        self.fields['height'].widget = forms.TextInput(attrs='size':site_id)

    height = forms.CharField()

(no probado)

Esto es lo que funcionó para mí. Estaba tratando de hacer un formulario personalizado. Este campo en el modelo es un campo char pero quería un campo de elección generado dinámicamente.

La forma:

class AddRatingForRound(forms.ModelForm):

    def __init__(self, round_list, *args, **kwargs):
        super(AddRatingForRound, self).__init__(*args, **kwargs)
        self.fields['name'] = forms.ChoiceField(choices=tuple([(name, name) for name in round_list]))

    class Meta:
        model = models.RatingSheet
        fields = ('name', )

Las vistas:

    interview = Interview.objects.get(pk=interview_pk)
    all_rounds = interview.round_set.order_by('created_at')
    all_round_names = [rnd.name for rnd in all_rounds]
    form = forms.AddRatingForRound(all_round_names)
    return render(request, 'add_rating.html', 'form': form, 'interview': interview, 'rounds': all_rounds)

La plantilla:

% csrf_token % % if interview % interview % if rounds % form.as_p % else %

No rounds found

% endif %

Al final de la web puedes encontrar las observaciones de otros creadores, tú además puedes dejar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *