Как стать автором
Обновить

Создаем профиль пользователя на Django 3

Всем доброго времени суток! Личный кабинет или профиль пользователя, как известно, вещь не редкая что в блоге, что в интрнет-магазине. Однако я как и многие джуны, изучающие джанго, сталкивалась со стеной полнейшего непонимания, пытаясь найти хоть что-то на эту тему в интернете. Поэтому эта статья создана для всех новчиков в 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' %}">&#8592; 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' %}">&#8592; Back</a>
        </div>
    &lt;div class="card-body"&gt;
        &lt;form method="POST" action="" enctype="multipart/form-data"&gt;
            {% csrf_token %}
            {{form.as_p}}
            &lt;input class="button" type="submit" value="Submit"&gt;
        &lt;/form&gt;
    &lt;/div&gt;
{% else %}
    &lt;a href="{% url 'login' %}"&gt;Login&lt;/a&gt;
{% endif %}

{% endblock content %}

Последний штрих: добавляем в urls.py наш путь

path('create_profile_page/',CreateProfilePageView.as_view(), name='create_user_profile'),

Теперь ваши пользователи имеют свои личные профили. Надеюсь, эта статья оказалась полезной:)

Если вы хотите прокачаться в работе с Django, то можете попробовать сделать возможность редактирования этого профиля.

Ссылка на репозиторий с исходным кодом

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.