this is a followup to my question here: ImageField / FileField Django form Currently unable to trim the path to filename
In my Django app, there is an imagefield uploaded to S3 After trim the imagefile path name, the image is not accessible because the url is trimmed. How can I trim the display but don't trim the path?
I manage to trim the display showing the filename like this
class CustomClearableFileInput(ClearableFileInput):
def get_context(self, name, value, attrs):
logging.debug("%s",name)
logging.debug("%s",value)
value.name = path.basename(value.name)
context = super().get_context(name, value, attrs)
return context
class CompanySettingEdit(forms.ModelForm):
company_logo = forms.ImageField(widget=CustomClearableFileInput)
this is the output:
https://imgur.com/a/M42Mz <-- display correct
https://bucketname.s3.amazonaws.com/media/certiport_logo.png <-- invalid url
If I dont trim it:
class CustomClearableFileInput(ClearableFileInput):
def get_context(self, name, value, attrs):
logging.debug("%s",name)
logging.debug("%s",value)
# value.name = path.basename(value.name) <-- remove this
context = super().get_context(name, value, attrs)
return context
class CompanySettingEdit(forms.ModelForm):
company_logo = forms.ImageField(widget=CustomClearableFileInput)
this is the output:
https://imgur.com/a/rGi8f <-- display incorrect
https://bucketname.s3.amazonaws.com/media/company_logo/15/certiport_logo.png <--valid url
my goal is to:
display: certiport_logo.png
url: https://bucketname.s3.amazonaws.com/media/company_logo/15/certiport_logo.png
How can I achieve this ?
The url
property of a FileField/ImageField is dynamic: it depends on the name
attribute just as str()
does at the time it is called. Instead, let's write to something besides name
and change the template to use it instead:
class CustomClearableFileInput(ClearableFileInput):
template_name = 'path/to/clearable_file_input.html'
# less confusing place than get_context...
def format_value(self, value):
if self.is_initial(value):
value.basename = path.basename(value.name)
return value
And for the template (modified and pretty printed from django source)
{% if widget.is_initial %}
{{ widget.initial_text }}:
<a href="{{ widget.value.url }}">
{{ widget.value.basename }} {# <== CHANGE #}
</a>
{% if not widget.required %}
<input type="checkbox" name="{{ widget.checkbox_name }}" id="{{ widget.checkbox_id }}" />
<label for="{{ widget.checkbox_id }}">{{ widget.clear_checkbox_label }}</label>
{% endif %}
<br /> {{ widget.input_text }}:
{% endif %}
<input type="{{ widget.type }}" name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %} />
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With