Всем доброго времени суток! Личный кабинет или профиль пользователя, как известно, вещь не редкая что в блоге, что в интрнет-магазине. Однако я как и многие джуны, изучающие джанго, сталкивалась со стеной полнейшего непонимания, пытаясь найти хоть что-то на эту тему в интернете. Поэтому эта статья создана для всех новчиков в Django.
Я предоставлю вам код, написанный мною при создании моего первого тудушника.
Итак, первое, что нам необходимо сделать - это создать модель для нашего профиля в models.py (предполагается, что у вас уже есть начатый джанго проект). Связывать профиль с нашим пользователем мы будем через OneToOne, что простым языком означает отношения "один к одному"(1 юзер имеет 1 профиль). Также создаем поля для аватарки и социальных сетей. Для картинки upload_to="images/profile/" указывает на то, что Django уже автоматически будет искать images/profile/ в MEDIA и класть в эту папку картинки, загруженные пользователями в качестве своей аватарки.
class Profile(models.Model):
user=models.OneToOneField(User, null=True, on_delete=models.CASCADE)
bio=models.TextField(null=True, blank=True)
profile_pic = models.ImageField(null=True, blank=True, upload_to="images/profile/")
facebook = models.CharField(max_length=50, null=True, blank=True)
twitter = models.CharField(max_length=50, null=True, blank=True)
instagram = models.CharField(max_length=50, null=True, blank=True)
def __str__(self):
return str(self.user)
Чтобы наша аватарка могла загружаться нам необходимо настроить MEDIA в settings.py:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
Переходим во views.py для написания представлений:
from django.views.generic.detail import DetailView
class ShowProfilePageView(DetailView):
model = Profile
template_name = 'base/user_profile.html'
def get_context_data(self, *args, **kwargs):
users = Profile.objects.all()
context = super(ShowProfilePageView, self).get_context_data(*args, **kwargs)
page_user = get_object_or_404(Profile, id=self.kwargs['pk'])
context['page_user'] = page_user
return context
Создаем template с именем user_profile.html и выставляем дефолтную аватарку если не загружено никакой другой. Картинки желательно загружать в формате png.
{% block content %}
<div class="header-bar">
<h1>Profile</h
<a href="{% url 'tasks' %}">← Back</a>
</div>
<div class="card-body">
{% if user.profile.profile_pic %}
<img src="{{ profile.profile_pic.url }}" height=100 width=100><br><br>
{% else %}
<img src="{% static 'base\images\profile\user.png' %}" height=100 width=100><br><br>
{% endif %}
<p><strong>Username:</strong> {{ page_user }}</p><br><br>
<p><strong>Bio:</strong> {{ profile.bio }}</p><br><br>
{% if profile.twitter %}
<p><strong>Twitter:</strong> {{ profile.twitter }}</p><br><br>
{% endif %}
{% if profile.instagram %}
<p><strong>Instagram:</strong> {{ profile.instagram }}</p><br><br>
{% endif %}
{% if profile.facebook %}
<p><strong>Facebook:</strong> {{ profile.facebook }}</p><br><br>
{% endif %}
{% if user.id == profile.user.id %}
<a href="{% url 'edit_user_profile' profile.id %}"><button class="button">Edit</button></a>
{% endif %}
</div>
{% endblock content %}
Прописываем пути в urls.py:
from django.urls import path
from django.contrib import admin
from .views import *
urlpatterns = [ path('user_profile/<int:pk>/', ShowProfilePageView.as_view(), name='user_profile'),
]
Казалось бы всё. А что еще нужно? Проблема заключается в том, что у новых зарегистрированных пользователей не будет этого профиля пока мы не дадим возможность им его создать и соответственно будет вылетать ошибка. Так что давайте еще немного покодим.
Переходим снова в представления. Не забываем прописывать success_url. В моем случае это страница с моим таск листом.
from django.views.generic.edit import CreateView
class CreateProfilePageView(CreateView):
model = Profile
template_name = 'base/create_profile.html'
fields = ['profile_pic', 'bio', 'facebook', 'twitter', 'instagram']
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
success_url = reverse_lazy('tasks')
Создаем create_profile.html. Не забываем прописывать enctype="multipart/form-data" для того, чтобы не было проблем с картинками.
{% block content %}
{% if request.user.is_authenticated %}
<div class="header-bar">
<a href="{% url 'tasks' %}">← Back</a>
</div>
<div class="card-body">
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
{{form.as_p}}
<input class="button" type="submit" value="Submit">
</form>
</div>
{% else %}
<a href="{% url 'login' %}">Login</a>
{% endif %}
{% endblock content %}
Последний штрих: добавляем в urls.py наш путь
path('create_profile_page/',CreateProfilePageView.as_view(), name='create_user_profile'),
Теперь ваши пользователи имеют свои личные профили. Надеюсь, эта статья оказалась полезной:)
Если вы хотите прокачаться в работе с Django, то можете попробовать сделать возможность редактирования этого профиля.