Pull to refresh

Создаем профиль пользователя на 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, то можете попробовать сделать возможность редактирования этого профиля.

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.