例のSNSのリーダー

f:id:elve:20210723081116p:plain
例のSNS
snack.elve.club

Django使うよ。設定してね。

結果


ユーザー名にマウスカーソル当てるとユーザーの自己紹介が出るヨ!

mysite\polls\models.py

pollsが何なのかは知らない。サンプル通りにやったらできたフォルダなのだ・・・。

from django.db import models
# Create your models here.
class USERS(models.Model):
id = models.CharField(primary_key=True,max_length=40)
created_at = models.DateTimeField()
updated_at = models.DateTimeField()
user_id = models.CharField(max_length=40)
description = models.CharField(max_length=300)
name = models.CharField(max_length=40)
class TWEETS(models.Model):
id = models.CharField(primary_key=True,max_length=40)
created_at = models.DateTimeField()
updated_at = models.DateTimeField()
user_id= models.CharField(max_length=40)
in_reply_to_text_id= models.CharField(max_length=40)
in_reply_to_user_id= models.CharField(max_length=40)
text= models.CharField(max_length=200)
user_name = models.CharField(max_length=30,null=True)
user_description =  models.CharField(max_length=300,null=True)

mysite\polls\views.py

from django.shortcuts import render
import requests
from polls.models import USERS,TWEETS
import datetime
def get_username(my_user_id):
try:
user = USERS.objects.get(user_id = my_user_id)
username=user.name
userdescription=user.description
except USERS.DoesNotExist:
username = my_user_id
userdescription=""
return {'username':username,'userdescription':userdescription}
def index(request):
url = "https://versatileapi.herokuapp.com/api/user/all"
users = requests.get(url).json()
USERS.objects.all().delete()
for user in users:
USERS.objects.create(
id = user['id'],
created_at = datetime.datetime.fromisoformat(user['_created_at']) ,
updated_at = datetime.datetime.fromisoformat(user['_updated_at']) ,
user_id = user['_user_id'],
description = user['description'],
name = user['name'])
url = "https://versatileapi.herokuapp.com/api/text/all?$orderby=_created_at desc&$limit=20"#全部取得すると重いので・・・
tweets = requests.get(url).json()
TWEETS.objects.all().delete()
for tweet in tweets:
Uid = tweet['_user_id']
my_user = get_username(Uid)
TWEETS.objects.create(
id = tweet['id'],
created_at = datetime.datetime.fromisoformat(tweet['_created_at']) ,
updated_at = datetime.datetime.fromisoformat(tweet['_updated_at']) ,
user_id = Uid,
in_reply_to_text_id = tweet['in_reply_to_text_id'] if 'in_reply_to_text_id' in tweet  else "",
in_reply_to_user_id = tweet['in_reply_to_user_id'] if 'in_reply_to_user_id' in tweet  else "",
text = tweet['text'],
user_name = my_user['username'],
user_description= my_user['userdescription'])
TWEETS.objects.order_by('created_at').reverse()
output = {'tweets': TWEETS.objects.all()}
return render(request, 'polls/index.html',output)

mysite\mysite\settings.pyに追記

# https://kokiblog.com/2019/09/12/django_css/
# https://blog.fantom.co.jp/2021/01/23/name-os-is-not-defined/
import os
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]

mysite\polls\static\style1.css

/*https://kokiblog.com/2019/09/12/django_css/*/
/*https://saruwakakun.com/html-css/reference/box*/
body {
background-color: #B2EBF2;
font-family: sans-serif;
}
h1{
width: 80%;
margin: 0 auto;
padding: 0.5em 1em;
max-width: 500px;
}
.box27 {
width: 80%;
position: relative;
margin: 2em auto;
padding: 0.5em 1em;
border: solid 3px #62c1ce;
max-width: 500px;
}
.box27 .box-title {
position: absolute;
display: inline-block;
top: -27px;
left: -3px;
padding: 0 9px;
height: 25px;
line-height: 25px;
font-size: 17px;
background: #62c1ce;
color: #ffffff;
font-weight: bold;
border-radius: 5px 5px 0 0;
}
.box27 p {
margin: 0;
padding: 0;
}
.add-time {
text-align : right;
}
/*https://www.jungleocean.com/programming/190308tooltip-css*/
.tooltip1{
position: absolute;
display: inline-block;
top: -27px;
left: -3px;
padding: 0 9px;
height: 25px;
line-height: 25px;
font-size: 17px;
background: #62c1ce;
color: #ffffff;
font-weight: bold;
border-radius: 5px 5px 0 0;
cursor: pointer;
display: inline-block;
}
.tooltip1 p{
margin:0;
padding:0;
}
.description1 {
display: none;
position: absolute;
padding: 10px;
font-size: 12px;
line-height: 1.6em;
color: #fff;
border-radius: 5px;
background: #000;
width: 200px;
}
.description1:before {
content: "";
position: absolute;
top: 0%;
right: 95%;
border: 15px solid transparent;
border-top: 15px solid #000;
margin-left: -15px;
transform: rotateZ(90deg);
}
.tooltip1:hover .description1{
display: inline-block;
top: 0px;
left: 80px;
}

mysite\polls\templates\polls\index.html

<!DOCTYPE html>
<!--https://kokiblog.com/2019/09/12/django_css/-->
{% load static %}
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta charset="UTF-8">
  <title>index.html</title>
  <link rel="stylesheet" href="{% static 'style1.css' %}">
</head>
<body>
<h1>test</h1>
{% for tweet in tweets %}
<div class="box27" id="{{tweet.user_id}}">
<div class="tooltip1">
<p>{{tweet.user_name}}</p>
<div class="description1">{{tweet.user_description}} </div>
</div>
<p>{{tweet.text}}</p>
<p class="add-time">{{tweet.created_at}}</p>
</div>
{% endfor %}
</body>
</html>

どのくらい面白かった?

星を押して送信してね

平均 0 / 5. Vote count: 0

是非フォローしてください

最新の情報をお伝えします

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です