Djangoでviews.pyのcontextの中身を明示的に出力してみよう

## 経緯
この記事はDjango内でのviews.pyからtemplateにデータをオブジェクトにして渡す際にどんなオブジェクトが使えるのかをどうしても明示的に確認したいという思いで書いた記事です。
基本的にはmodels.pyで定義しているClassの変数がkeyになるのはわかっているのですが、実際にviewsで使う直前で知りたかったんです。それが分かったので使い回しが聞きやすいように関数にしました。

### 条件
1. OS : Mac
1. Python : 3.7.6
1. Django : 3.2.0
1. Editor : VS Code

### できること
requestで渡ってくる変数の中身(keyとvalue)が何なのかを判定するための関数

```python:views.py
def checkContextKeyAndValues(arg):
    mold =str(type(arg))
    print(f"型: {mold}")

    # models.pyで定義されているclassかどうかを判定(findメソッドを使用)
    check_file_name ="models"
    if mold.find(check_file_name):
            
        listArg = vars(arg)
        # print("型:",type(checkMethod1))
        
        print('classの中身のkey,valueの一覧はこちら')
        # ループでkeyを取り出す
        for v in listArg:
            # print(f"{v}:",getattr(arg1,v))
            key = v
            value =getattr(arg,v)
            print(f"{key}: {value}")

        print('=以上=')
    else:
        print("定義済みのclassではありません")
    
    '''
    参照記事
    classのkeyを取得する方法(vars)
    https://qiita.com/ganyariya/items/e01e0355c78e27c59d41
    https://minus9d.hatenablog.com/entry/2016/11/13/222629
    
    classのvalueを参照する方法(getattr)
    https://stackoverflow.com/questions/64039737/object-is-not-subscriptable-using-django-and-python
    '''
```

実際に使ってみる側ではどう書いているかが以下になります

```python:views.py
def userAccount(request):
    profile = request.user.profile
    
    # contextとして渡すものが何なのかをチェックする
    checkContextKeyAndValues(profile)
    
    context = {"profile": profile}
    return render(request, "users/account.html", context)
```
---
### コンソールの出力結果

```terminal
型: <class 'users.models.Profile'>
classの中身のkey,valueの一覧はこちら
_state: <django.db.models.base.ModelState object at 0x7f8add22c510>
user_id: 2
name: kate
email: kate_moss@moss.com
username: kate123
location: London
short_intro: short text
bio: Lorem Ipsum
profile_image: profiles/km.jpeg
social_github: hogehoge
social_twitter: fugafuga
created: 2024-01-04 01:01:01.213881+00:00
id: d379cd07-ee37-9cb7-d6f4-dd6f605c7e0a
=以上=
```
## 結論
２つとも組み込み関数であるvars()とgetattr()をうまく使うことでcontextに収めるkeyとvalueをtemplateに渡す前に確認できました!!
template側でどんなkeyが使えるのかちゃんと明示的に知りたいと思っていたので少し便利になりました！


おまけ
※一応models.pyで定義しているProfile Class側も書き記しておきます
```python:models.py
from django.db import models
from django.contrib.auth.models import User
import uuid

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True)
    name = models.CharField(max_length=200, blank=True, null=True)
    email = models.EmailField(max_length=500, blank=True, null=True)
    username = models.CharField(max_length=200, blank=True, null=True)
    location = models.CharField(max_length=200, blank=True, null=True)
    short_intro = models.CharField(max_length=200, blank=True, null=True)
    bio = models.TextField(blank=True, null=True)
    profile_image = models.ImageField(
        blank=True,
        null=True,
        upload_to="profiles/",
        default="profiles/user-default.png",
    )
    social_github = models.CharField(max_length=200, blank=True, null=True)
    social_twitter = models.CharField(max_length=200, blank=True, null=True)
    created = models.DateTimeField(auto_now_add=True)
    id = models.UUIDField(
        default=uuid.uuid4, unique=True, primary_key=True, editable=False
    )
```

[参照リンク一覧]

https://qiita.com/ganyariya/items/e01e0355c78e27c59d41

https://minus9d.hatenablog.com/entry/2016/11/13/222629

https://stackoverflow.com/questions/64039737/object-is-not-subscriptable-using-django-and-python