ユーザープロフィール


シリーズの今日の部分では、我々はプロファイルの画像などの追加情報を含むことによって、ユーザーのプロファイルを作成するつもりだとバイオ.
まず、ビュー内のプロファイルビューを作成できます.パイ
ビューパイ
from django.shortcuts import render
from django.contrib.auth.decorators import login_required


@login_required
def profile(request):
    return render(request, 'users/profile.html')
  • 後でこのビューを変更して、ユーザーにプロファイルを更新させます.
  • The login_required デコレータはログインしたユーザーへのアクセスを制限します.
  • ログインしていないユーザーはプロフィールページにアクセスできません.ユーザがそうしようとするならば、login_required() ウィルリダイレクト彼/彼女にsettings.LOGIN_URL 問い合わせの文字列に現在の絶対パスを渡します.例:/login/?next=/profile/
  • この例のパスからわかるように、この関数はユーザがアクセスしようとしているページを追跡します.したがって、それは、彼らが成功した認証の後、最初の場所に尋ねたプロフィールページに、ユーザーをリダイレクトします.
  • オープンユーザーアプリのURL.Pyとプロファイルビューのルートを追加します.
    ユーザー/URL.パイ
    from django.urls import path
    from .views import profile
    
    urlpatterns = [
        # Add this
        path('profile/', profile, name='users-profile'),
    ]
    
    ユーザーアプリケーションテンプレートディレクトリ内のビューのテンプレートを作成します.
    プロファイル.HTML
    {% extends "users/base.html" %}
    {% block title %}Profile Page{% endblock title %}
    {% block content %}
        <div class="row my-3 p-3">
            <h1>This is the profile page for {{user.username}}</h1>
        </div>
    
    {% endblock content %}
    
  • このテンプレートを後でユーザーのプロフィールを表示するように変更しますが、まず最初に必要なことがあります.

  • 1対1リンクを用いたユーザモデルの拡張
    それは私たちのプロファイルをモデル化するために、ユーザーのプロファイル画像とバイオフィールドがデータベースに格納されるようになるまでの時間です.
    認証に関連していないユーザについての追加情報を保存したい場合は、ユーザと1対1のリンクを持つ新しいモデルを作成することができます.
    Djangoでは、私たちは OneToOneField モデルフィールド.
  • 一対一の関係において、テーブルの1つのレコードは、外部キーを使用している1つのレコードおよび他のテーブルの1つのレコードだけに関連付けられる.例-ユーザーモデルインスタンスは1つのプロファイルインスタンスのみに関連付けられます.
  • 2つのフィールド、アバター(プロフィール写真)とバイオでプロファイルモデルを作成しましょう.必要に応じて追加できます.
    モデル.パイ
    from django.db import models
    from django.contrib.auth.models import User
    
    
    # Extending User Model Using a One-To-One Link
    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
    
        avatar = models.ImageField(default='default.jpg', upload_to='profile_images')
        bio = models.TextField()
    
        def __str__(self):
            return self.user.username
    
  • 最初の引数OneToOneField 現在のモデルがどのモデルに関連するかを指定します.二番目の引数on_delete=models.CASCADE ユーザーが削除された場合、同様に彼/彼女のプロファイルを削除することを意味します.
  • 最初の引数ImageField , default='default.jpg' ユーザーが自分自身をアップロードしない場合は、デフォルトのイメージを使用します.二番目の引数upload_to='profile_images' 画像がアップロードされるディレクトリです.
  • Bioは、ユーザーに関するいくつかの情報が格納されているテキストフィールドです.
  • ダンク__str__ メソッドは、プロファイルのインスタンスがプリントアウトされたときにオブジェクトを文字列表現に変換します.それで、我々がユーザーのプロフィールを印刷するときはいつでも、それは彼/彼女のユーザー名を表示します.
  • 大丈夫、この仕事をするために必要なライブラリがあります.これまでのPythonでのイメージで働いた?もしそうなら、おそらく知っているpillow これはPythonで画像の操作を行うことができる最も一般的な画像処理ライブラリの一つです.
    Djangoは私たちがこのライブラリをImageField , そのため、次のように入力してください.pip install pillow変更は、データベース内の効果を取るためには、移動を実行しましょう.python manage.py makemigrations python manage.py migrate
  • つの他の重要なステップは、ユーザーモデル管理者の中にプロフィールモデルを登録することです.Py
  • 管理.パイ
    from django.contrib import admin
    from .models import Profile
    
    admin.site.register(Profile)
    
  • 上記のコードはプロファイルモデルをインポートしadmin.site.register 登録する.
  • これで管理パネルにログインし、作成したモデルを見ることができます.

    ユーザーのアップロードされたファイル
    Djangoのメディアファイルで作業するときは、ローカルにファイルを保存し、必要に応じてそれらを提供するためにいくつかの設定を変更する必要があります.
    特に設定でMediaRange URLとMediaHorseルートを設定する必要があります.
  • MEDIA_ROOT アップロードされたファイルが格納されるディレクトリへのフルパスです.通常、プロジェクトのベースディレクトリ内にディレクトリを作成することによってそのようなファイルを保存します.
  • MEDIA_URL ベースURLはメディアファイルを提供します.これは私たちのWebブラウザを介してメディアにアクセスすることができますです.
  • 設定.パイ
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    MEDIA_URL = '/media/'
    
    プロジェクトのURLを設定します.ユーザが提供するPYは、開発中にメディアファイルをアップロードしました.
    UserRange管理/URL.パイ
    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        # ... 
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
    これで、メディアルートフォルダにファイルを追加できます.
  • 上記のイメージからわかるように、ユーザーがアップロードするプロフィール写真は中で生きます/media/profile_images/your_image . 我々は、使用を使用してフロントエンドを作成するまで写真をアップロードするには、管理パネルに行くことができますし、登録されているユーザーのイメージを作成するすべての場合はうまく動作しているかどうかを確認します.
  • ユーザーに与えられたデフォルトのプロファイル画像/media/ したがって、このディレクトリの中に名前を付けたい任意のデフォルトイメージを入れてくださいdefault.jpg .

  • ジャンゴの信号
    ユーザーが作成されるたびに、プロファイルページを作成するために管理ページに行かなければならないことに注意してください.新しいユーザーが作成されるとき、我々がプロフィールを自動的につくることができるならば、それは素晴らしいです.これを行うにはシグナルを使います.
    しかし、信号は?
    シグナルはデータベースの特定のエントリの変更/作成に何らかの動作を実行するために使用されます.
    信号では、次の基本的な概念があります.

  • 送付者:通常、イベントが起こるとき、受信機に通知するモデルです.

  • 受信機:通常、受信機は、ユーザインスタンスがちょうどデータベースの中でちょうど保存されることになっているとき、例えば、それが起こった若干の行動の通知されると、データの上で働く機能です.
  • 送付者と受信機の間の接続は、「信号発送係」を通してされます.
  • 使用します:-シグナルを使用すると、新しいユーザーインスタンスがデータベース内に作成されたときに、プロファイルのインスタンスの右を作成できます.
    DJangoは、単一のモジュールとしてアプリケーションのディレクトリに信号を置くことをお勧めします.したがって、シグナルを作成します.ユーザーアプリ内のPYファイル.
    シグナルパイ
    from django.db.models.signals import post_save
    from django.contrib.auth.models import User
    from django.dispatch import receiver
    
    from .models import Profile
    
    
    @receiver(post_save, sender=User)
    def create_profile(sender, instance, created, **kwargs):
        if created:
            Profile.objects.create(user=instance)
    
    
    @receiver(post_save, sender=User)
    def save_profile(sender, instance, **kwargs):
        instance.profile.save()
    
    
  • create_profile ユーザーが作成されるたびに実行される受信機関数です.
  • ユーザーは、通知を行う責任がある送信者です.
  • post_save はsaveメソッドの最後に送られるシグナルです.
  • 一般的に、上記のコードはユーザーモデルsave() メソッドが実行を終了した場合、シグナルを送信します(post_save ) 受信関数(create_profile ) 次に、この関数は、そのユーザーのプロファイルインスタンスを作成して保存するためのシグナルを受け取ります.
  • 次のステップは、受信機をready() 信号モジュールをインポートすることにより、アプリケーションの設定の方法.オープンアプリ.Pyのユーザーアプリケーションの任意のアプリケーション構成を含めることができます.
    アプリ.パイ
    from django.apps import AppConfig
    
    
    class UserConfig(AppConfig):
        default_auto_field = 'django.db.models.BigAutoField'
        name = 'users'
    
        # add this
        def ready(self):
            import users.signals  # noqa
    
  • 私たちがしたことはready() ユーザ登録アプリケーションの方法.
  • 我々がベルトの下で上記のものを持っている今、我々はユーザーが彼らのプロフィールを更新して、テンプレートの中に情報を示すフォームを作成します.
    あなたが完成アプリを見つけることができますgithub .
    任意のコメントや提案を歓迎します.