No pude encontrar esto en los documentos, pero creo que debe ser posible. Estoy hablando específicamente del widget ClearableFileInput. A partir de un proyecto en Django 1.2.6 tengo este formulario:¿Cómo puedo personalizar la salida html de un widget en Django?
# the profile picture upload form
class ProfileImageUploadForm(forms.ModelForm):
"""
simple form for uploading an image. only a filefield is provided
"""
delete = forms.BooleanField(required=False,widget=forms.CheckboxInput())
def save(self):
# some stuff here to check if "delete" is checked
# and then delete the file
# 8 lines
def is_valid(self):
# some more stuff here to make the form valid
# allthough the file input field is empty
# another 8 lines
class Meta:
model = SocialUserProfile
fields = ('image',)
que luego representa utilizando el código de plantilla:
<form action="/profile/edit/" method="post" enctype="multipart/form-data">
Delete your image:
<label> {{ upload_form.delete }} Ok, delete </label>
<button name="delete_image" type="submit" value="Save">Delete Image</button>
Or upload a new image:
{{ upload_form.image }}
<button name="upload_image" type="submit" value="Save">Start Upload</button>
{% csrf_token %}
</form>
Como Django 1.3.1 ahora utiliza ClearableFileInput como el control por defecto, i bastante seguro de que puedo saltar las 16 líneas de mi form.save y simplemente acortar el código del formulario de esta manera:
# the profile picture upload form
class ProfileImageUploadForm(forms.ModelForm):
"""
simple form for uploading an image. only a filefield is provided
"""
class Meta:
model = SocialUserProfile
fields = ('image',)
que me daría la buena sensación que tengo formcode menos personalizado, y puede depender de XX e Django builtins.
Me gustaría, por supuesto, mantener la salida html igual que antes. Cuando utilice el código de plantilla existente, cosas como "Actualmente: nombredearchivo.png" aparecen en lugares donde no las quiero.
Dividir el formfield aún más, como {{ upload_form.image.file }}
parece que no funciona. Lo siguiente que me vino a la mente fue escribir un widget personalizado. Lo cual funcionaría exactamente en contra de mis esfuerzos para eliminar tantos códigos personalizados como sea posible.
¿Alguna idea de lo que sería lo más simple de hacer en este escenario?
respuesta corta: PASO 1: extender el PASO clase de aparato 2: reemplazar el widget para su campo Nota: desea para usar el widget subclasificado que creó en el paso 1 en el método '__init__' de la forma django. Si necesita ejemplos, hágamelo saber y lo haré esta tarde. –
Lo último en lo que estaba pensando es en sobreescribir la plantilla utilizada por el widget. Le agradecería que sintonice esta tarde (obviamente se encuentra en un continente diferente al que yo tengo, ya que aquí está listo para las 16:15: D) – marue
Sí, cuando salga del trabajo, mal le doy un ejemplo. ~ 5 o más horas –