¿Cómo anular los campos de un formulario de modelo en un conjunto de formularios de modelo?

Tengo un caso especial en el que los usuarios deberían poder cambiar el estado del trato, pero no el deal_type. Por lo tanto, pensé en cambiar el widget del menú desplegable en un campo de texto.

Por lo tanto, me gustaría anular el widget de deal_type en mi formset y lo subclasifiqué BaseModelFormSet y pasó eso como un parámetro a la fábrica:

deal_formset = modelformset_factory(Deal, formset=BaseDealFormSet, fields = {'status', 'deal_type'}, extra=0)


class Deal(models.Model):
    deal_id             = UUIDField()
    status              = models.ForeignKey(DealStatus)    
    deal_type           = models.ForeignKey(DealType)    


class BaseDealFormSet(BaseModelFormSet):    
    deal_type        = forms.CharField(max_length=30, widget=forms.TextInput(  attrs={'readonly': 'True'}))    

    def clean_deal_type(self):
        return self.instance.deal_type

Sin embargo, en la plantilla {{fs.deal_type}} el widget aún se muestra como un menú desplegable y no como un campo de texto.

Ni siquiera estoy seguro de si esto funcionaría exactamente como pretendía, es decir, ver el valor seleccionado del menú desplegable como un campo de texto. Pero al menos debería ver un cambio del widget, ¿no? Pero parece que se ignora por completo.

¿Qué me estoy perdiendo? Gracias,

preguntado el 31 de julio de 12 a las 09:07

ah cierto ¿Cómo anularía el formulario real en este caso? Porque el modelformset_factory está creando la forma del Modelo directamente. -

1 Respuestas

Debe crear una subclase ModelForm con sus personalizaciones y pasarla como el form argumento para modelformset_factory.

class DealForm(forms.ModelForm):    
    deal_type = forms.CharField(max_length=30,
                                widget=forms.TextInput(attrs={'readonly': 'True'}))

    def clean_deal_type(self):
        return self.instance.deal_type

...

deal_formset = modelformset_factory(Deal, form=DealForm,
                                    fields=['status', 'deal_type'], extra=0)

Tenga en cuenta que hay bastante flexibilidad en la forma de hacer esto: el fields podría ir en una clase Meta interna en el formulario, podría mantener su subclase modelformset y colocar la declaración del formulario allí, y así sucesivamente.

Respondido 31 Jul 12, 10:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.