Как отобразить изображение в качестве текущего значения поля ImageField в приложении DJango
У меня есть такая форма в шаблоне Django:
<form action="{% url 'MCARS:Service-Record' %}" method="POST">
{% csrf_token %}
<div class="box-body">
{% for field in form %}
{% if not forloop.counter|divisibleby:2 %}
<div class="row">
{% endif %}
<div class="col-md-6">
<div class="mb-3 form-element form-control">
{{ field.label_tag }}
{% if field.errors %}
{% for error in field.errors %}
{{ error }}
{% endfor %}
{% endif %}
{% if field.ClearableFileInput %}
<div>
<p>Current Image:</p>
<img src="{% static form.instance.avatar.url %}" alt="Uploaded Image" style="max-width: 300px; height: auto;">
</div>
{% endif %}
{{ field|add_class:'form-control' }}
</div>
</div>
{% if forloop.counter|divisibleby:2 %}
</div>
{% endif %}
{% endfor %}
</div>
<div class="text-end">
<button type="submit" class="btn btn-primary mt-2"><i class="mdi mdi-content-save"></i> Save</button>
</div>
</form>
используя эту модель,
lass Profile(models.Model):
# Managed fields
user = models.OneToOneField(User, related_name="profile", on_delete=models.CASCADE)
memberId = models.CharField(unique=True, max_length=15, null=False, blank=False, default=GenerateFA)
bio = models.TextField(null=True, blank=True)
avatar = models.ImageField(upload_to="static/MCARS/img/members", null=True, blank=True)
birthday = models.DateField(null=True, blank=True)
gender = models.CharField(max_length=10, choices=constants.GENDER_CHOICES, null=True, blank=True)
и эта форма
class UserProfileForm(ModelForm):
class Meta:
model = Profile
exclude = ('user','memberId','invited', 'registered')
Там есть одно поле, которое называется аватар. Я добираюсь до этой части шаблона:
{% if field.ClearableFileInput %}
<div>
<p>Current Image:</p>
<img src="{% static form.instance.avatar.url %}" alt="Uploaded Image" style="max-width: 300px; height: auto;">
</div>
{% endif %}
и я не могу заставить изображение отображаться. Что я упускаю?
Спасибо!
Прежде всего, {% static %}
предназначен для статических файлов (таких как CSS / JS), а не для загрузки мультимедийных файлов, таких как изображения, загруженные пользователями.
Во-вторых,
field.ClearableFileInput
таким образом, вычисление выполняется неправильно. Вместо этого проверьте имя поля (field.name
) или, в частности, поле avatar
.
обновите блок в вашем шаблоне:
{% if field.name == "avatar" and form.instance.avatar %}
<div>
<p>Current Image:</p>
<img src="{{ form.instance.avatar.url }}" alt="Uploaded Image" style="max-width: 300px; height: auto;">
</div>
{% endif %}
убедитесь, что в настройках установлены следующие параметры.py и urls.py файл.
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... your other urls ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# Don't store media inside static/ change it to-
avatar = models.ImageField(upload_to="MCARS/img/members", ...)
Я думаю, что в вашем field.ClearableFileInput
попробуйте сделать это:
{% if field.name == 'avatar' and form.instance.avatar %}
<div>
<p>Current Image:</p>
<img src="{% static form.instance.avatar.url %}" alt="Uploaded Image" style="max-width: 300px; height: auto;">
</div>
{% endif %}
И если вы динамически загружаете изображения от пользователя, то нет необходимости в static
в
<img src="{% static form.instance.avatar.url %}" alt="Uploaded Image" style="max-width: 300px; height: auto;">
вместо этого используйте media route для сохранения изображений, загруженных пользователем
проверьте, как это использовать:
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'