Проблема с отображением картинки django
Наткнулся на странную проблему с отображением картинок, но дня начала покажу код. общие настройки:
STATIC_URL = '/static/'
STATICFILES_DIRS = (
BASE_DIR / 'static',
)
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
основной urls
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('main.urls', namespace='main')),
path('users/', include('users.urls', namespace='users')),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Кусочек модели Barbershops
logo = models.ImageField(upload_to='users/masters_logo', null=True, blank=True,
default='static/img/img.png')
Картинка по умолчанию у меня храниться в media/static/img/.. Но для статических файлов я использую именно папку static, для понимания привожу картинку:
Мой контроллер который служит формой редактирования Barbershops
@login_required
def barbershop_profile(request):
barbershop = Barbershops.objects.get(user=request.user)
if request.method == "POST":
form = BarbershopChangeForm(data=request.POST, instance=barbershop, files=request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('users:barbershop_profile'))
else:
context = {
'form': BarbershopChangeForm(instance=barbershop)
}
return render(request, 'users/owner_templates/creating_barbershop_page.html', context=context)
Форма джанго:
class BarbershopChangeForm(UserChangeForm):
class Meta:
model = Barbershops
fields = ('name', 'description', 'inst', 'image_background', 'logo', 'address')
Вот как выглядит фронт
<div style="color: black;">
<form action="{% url 'users:barbershop_profile' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<label for="">Назва закладу - </label>
<p>{{ form.name }}</p>
<label for="">Адреса - </label>
<p>{{ form.address }}</p>
<label for="">Опис - </label>
<p>{{ form.description }}</p>
<label for="">Посилання на інстаграм - </label>
<p> {{ form.inst }}</p>
<p>{{ form.logo }}</p>
<img src="{{ form.logo.url }}">
<img src="{{ form.logo }}">
<button type="submit">Submit</button>
</form>
</div>
что интересно, когда перехожу по ссылке в теге p, то изображение открывается по правильной ссылке: /media/static/img/img.png
Для модели Users, также есть подобное поле, и там работает все отлично
image = models.ImageField(upload_to='users/users_profile_pictures', null=True, blank=True,
default='static/img/default-avatar-profile-icon-of-social-media-user-vector.jpg')
и вот отображение пути на фронте если обернуть в тег p:
Если не отображается - значит что-то не так со ссылкой. Ищите ошибку. У меня тоже такое было - в views.py неполный путь сохранения. html будет в таком случае выдавать что-то типа: "файл не найден". Как пофиксить: пойдем по порядку, в общих настройках всё хорошо; в urls может быть что-то вроде
+= static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
что-то вроде
from django.conf.urls.static import static
может быть поможет; в моделях, формах, фронте ничего крамольного не вижу. Проверьте ещё раз все ссылки по коду и куда они ведут, наличие всех нужных библиотек. (Как ни странно но в очень редких случаях может помочь открыть в другом браузере.)