Почему медиафайлы не отрисовываются и не отображаются при запуске приложения?
Я работаю с Django 3.2.6 и я только начинающий. У меня есть один проект(AwsomeWeb2
), в котором есть 4 приложения(Users, Posts, PasswordReset, Contact
). У меня есть один класс в Users, который сохраняет информацию о профилях пользователей:
class MyUser(models.Model):
user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
first_name = models.CharField(max_length=50, null=True, blank=True)
last_name = models.CharField(max_length=50, null=True, blank=True)
mobile_number = models.CharField(max_length=20, unique=True, null=True, blank=True)
birthday = models.DateField( null=True, blank=True)
profile_photo = models.ImageField(default="images.png", null=True, blank=True,upload_to='profiles')
date_joined = models.DateTimeField(auto_now_add=True, null=True, blank=True)
country = models.CharField(max_length=15, null=True, blank=True)
city = models.CharField(max_length=15, null=True, blank=True)
region = models.CharField(max_length=15, null=True, blank=True)
address = models.TextField(null=True, blank=True)
postal_code = models.CharField(max_length=10, unique=True)
is_active = models.BooleanField(default=True)
user_email = models.EmailField(null=True, blank=True)
uni_name = models.ForeignKey('University' , on_delete=CASCADE , default='university name')
major_name = models.ForeignKey('Major' , on_delete=CASCADE , default='major name')
def __str__(self):
return f"{self.first_name} {self.last_name}"
User.profile = property(lambda u : MyUser.objects.get_or_create(user = u)[0])
У меня есть одно поле profile_photo
, которое предназначено для сохранения фотографий профиля пользователей. У меня есть форма в forms.py
, которая связана с этим model
:
class MyUserProfile(forms.ModelForm):
class Meta:
model= MyUser
fields = (
'first_name',
'last_name',
'mobile_number',
'birthday',
'profile_photo',
'country',
'city',
'region',
'address',
'postal_code',
'user_email'
)
Я также добавляю несколько строк в setting.py
для media
файлов:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media/')
При создании профиля фотография, которую я выбираю, будет установлена в каталоге AwsomeWeb2/media/profiles/
, но когда я запускаю свое приложение на сервере, она не отображается. Вот моя views.py
функция:
@login_required(login_url='login')
def accountSettings(request):
if request.method == "POST":
user_account_form = MyUserProfile(request.POST , request.FILES, instance=request.user.profile)
if user_account_form.is_valid():
user_account_form.save()
messages.success(request, ('Your profile was successfully created(updated)!!'))
else:
messages.error(request, 'Error saving form')
return redirect("http://127.0.0.1:8000/")
else:
user = request.user
profile = user.profile
user_account_form = MyUserProfile(instance=profile)
context = {'form' : user_account_form}
return render(request , 'user/user.html' , context)
А вот код для user.html
:
<!DOCTYPE html>
{% extends "base.html" %}
{% load static %}
<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap/min.css" media="screen">
{% block content%}
{% load crispy_forms_tags %}
<style>
.profile-pic{
max-width: 200px;
max-height:200px;
margin: 0 auto;
border-radius: 50%;
}
</style>
<br>
<div class="row">
<div class="col-md-3">
<div class="card card-body">
<a class="btn btn-warning" href="{% url 'Posts:home' %}"> ← Back to Home</a>
<hr>
<h3 style="text-align: center">Account Settings</h3>
<hr>
<img class="profile-pic" src="{{user.profile_photo.url}}" >
</div>
</div>
<div class="col-md-9">
<div class="card card-body">
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
{{form|crispy}}
<button class="btn btn-primary" type="submit">Update your profile</button>
</form>
</div>
</div>
</div>
{% endblock %}
А также я добавил media urls
в свой проект urls.py
:
from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('' , include('Posts.urls')),
path('contact/contactform/',include('Contact.urls')),
path('userforms/', include('Users.urls')),
path('resetpass/', include('PasswordReset.urls')),
# ####################################################
path('password_reset/done/' , auth_views.PasswordResetDoneView.as_view(template_name='password/password_reset_done.html'), name='password_reset_done'),
path('reset/<uidb64>/<token>' , auth_views.PasswordResetConfirmView.as_view(template_name='password/password_reset_confirm.html'), name='password_reset_confirm'),
path('reset/done/' , auth_views.PasswordResetCompleteView.as_view(template_name='password/password_reset_complete.html'), name='password_reset_complete'),
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Но он по-прежнему не работает. Я также прочитал несколько сообщений о той же проблеме, но, к сожалению, не смог ее решить. Буду благодарен за помощь и совет.
Здесь ссылка на весь мой проект.
проблема в этом коде:
<img class="profile-pic" src="{{user.profile_photo.url}}" >
он должен быть таким:
<img class="profile-pic" src="{{request.user.myuser.profile_photo.url}}" >
Потому что в html файлах для получения текущего пользователя нужно вызвать request.user
а для получения фотографии профиля нужно сначала обратиться к myuser