ג'נגו – איך הוספתי עוד צפיות לשבט החדשות של האקרים שלי – תהיו בצד הנכון של השינוי

פרסומת
MAGNEZIX מגנזיקס


ה תחילת הדרכה של פרויקט זה על קידוד ה חדשות האקר clone ראה אותנו יוצרים שלושה מודלים ושתי פונקציות תצוגה שיוצגו בתבניות להצגת המשתמשים. פונקציית התצוגה הראשונה פשוט מציגה את כל הפוסטים במסד הנתונים ואילו השנייה מציגה פוסטים אחרונים.

פרסומת

כפי שניתן לראות, התבניות מכילות קישורים למספר דפים שטרם נוצרו.

בואו נראה כמה רחוק אנחנו יכולים להגיע ליצירת כל הדעות הללו. זכור, מטרת פרויקט זה היא לחזק את ההבנה שלך ב-Python ו-Django כפי שהם משמשים בפיתוח אתרים.

הודעות העבר

פונקציית התצוגה השנייה של הסדרה הקודמת מציגה את הפוסטים האחרונים. מה אם נרצה לראות פוסטים קודמים? באתר האקר ניוז יש קישור לראות פוסטים שנשלחו לפני 30 דקות או פחות. אנחנו רוצים להוסיף את התכונה הזו לאפליקציה שלנו.

from django.utils import timezone
from datetime import datetime, timedelta


def PastPostListView(request):
    time = str((datetime.now(tz=timezone.utc) - timedelta(minutes=30)))
    posts = Post.objects.filter(created_on__lte = time)
    for post in posts:
        post.count_votes()
        post.count_comments()

    context={
        'posts': posts,
    }
    return render(request, 'pastpostlist.html', context)

פונקציית תצוגה זו מסננת את הפוסטים שפורסמו לפני 30 דקות. הוא עושה זאת על ידי הגדרת הזמן באמצעות ה- datetime מודול. המודול מקבל את אזור הזמן הנוכחי של המשתמש, הורידו ממנו 30 דקות באמצעות ה- timedelta סוג, ומעביר אותו לפונקציית השאילתה. לפונקציה יש א created_on__lte פָּרָמֶטֶר.

ה created_on הוא השם של datetime שדה במסד הנתונים (בדוק את models.py קובץ) תוך כדי __lte כאן פירושו פחות מ או שווה.

לפיכך, הוא מבצע שאילתות במסד הנתונים ומסנן אותו על סמך פוסטים שנשלחו לפני 30 דקות או פחות.

כתובת האתר תהיה כזו:

path('past', PastPostListView, name="past_home"),

והתבנית תהיה זהה לשתי התבניות הקודמות.

מציג את פרטי המשתמש

באתר האקר ניוז כל פוסט מגיע עם שם האדם (היוצר) ששלח אותו. כמו כן, מצורף קישור לשם שאחרים יוכלו ללחוץ עליהם כדי ללמוד עוד על היוצר. אז, אנחנו צריכים ליצור את הדעות עבור כאלה.

מה אנחנו מצפים לראות בדף המידע של המשתמש? כמובן, שם היוצר, וקישור המציג את כל הפוסטים שנוצרו על ידי היוצר. זה אומר שניצור שתי פונקציות תצוגה. אחד למידע על היוצר והשני לכל הפוסטים שיצר היוצר.

def UserInfoView(request,username):
    user = User.objects.get(username=username)
    context = {
        'user': user,
    }
    return render(request, 'user_info.html', context)

כאן, אנו קוראים ל- User class כדי לאחזר מידע על משתמש מסוים ולהעביר אותו ל- render() פונקציה שתוצג לאחר מכן בתבנית. מכיוון ששם משתמש מועבר כפרמטר לפונקציה, המסלול יכלול גם את שם המשתמש כפי שאנו יכולים לראות להלן:

path('user/<username>', UserInfoView, name="user_info"),

והתבנית תהיה כזו:

{% extends 'base.html' %}
{% block content %}

<div class="topnav">
  <a class="active" href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"home'%}">Hacker News</a>
  <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"new_home'%}">New</a>
  <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"past_home'%}">Past</a>
  <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"submit'%}">Submit</a>

  {% if request.user.is_authenticated %}
    <div class="topnav-right">
      <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"signout' %}">Sign Out </a>
    </div>
  {% else %}

<div class="topnav-right">
      <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"signin' %}">Sign In </a>
    </div>
  {% endif %}
</div>

<div class="w3-panel w3-light-grey w3-leftbar w3-border-grey">
<p><strong>User: </strong>{{user.username}}</p>
<p><strong>Created: </strong>{{user.date_joined}}</p>
</div>

<a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"user_posts' user.username %}">Submissions</a>

ברגע שאדם מחובר, הוא יכול לראות מידע על היוצר. שימו לב שפרטי המשתמש מציגים גם את התאריך שבו היוצר הצטרף לאתר השיבוט של האקר ניוז שלנו.

כעת, כדי לראות את כל הפוסטים של יוצר מסוים, מצורף גם קישור ל'הגשות'. זוהי פונקציית התצוגה השנייה שניצור כעת.

def UserSubmissions(request,username):
    user = User.objects.get(username=username)
    posts = Post.objects.filter(creator = user)
    for post in posts:
        post.count_votes()
        post.count_comments()
    return render(request, 'user_posts.html', {'posts': posts})

אנו קוראים לשני מודלים Classes בפונקציית תצוגה זו. הראשון שימש כדי להעביר משתמש (יוצר) מסוים באמצעות פרמטר שם המשתמש לפונקציה, ומעביר אותו ל- Post מעמד. השני מסנן את כל הפוסטים על סמך יוצר מסוים שהוא קיבל מה- User מעמד.

כרגיל, יש למלא את שדות ההצבעות וההערות עבור כל פוסט במספר המתאים על ידי קריאה לשיטות.

מסלולי ה-URL יהיו:

path('posts/<username>',UserSubmissions, name="user_posts"),

ראית איך המסלול מתאים לקישור המצורף ל'הגשה' בתבנית למעלה? על ידי שימוש בשם שצוין במסלול כתובת האתר, אנו מתייחסים לפונקציית תצוגה זו. אבל זה לא הכל. זכור שבפונקציית התצוגה הקודמת, משתנה המשתמש הועבר במילון ההקשר.

זה מקיף כל מידע על המשתמש. לכן כדי לקבל את שם המשתמש שיועבר כפרמטר לפונקציית התצוגה השנייה הזו, user.username יש לכלול בקישור. לאחר שהשם יועבר לפונקציית תצוגה זו, כל פוסט שנשלח על ידי האדם הנושא את השם הזה יוצג.

התבנית עבור פונקציית תצוגה זו תהיה:

{% extends 'base.html' %}
{% block content %}

<div class="topnav">
  <a class="active" href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"home'%}">Hacker News</a>
  <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"new_home'%}">New</a>
  <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"past_home'%}">Past</a>
  <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"submit'%}">Submit</a>

  {% if request.user.is_authenticated %}
    <div class="topnav-right">
      <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"signout' %}">Sign Out </a>
    </div>
  {% else %}
    <div class="topnav-right">
      <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"signin' %}">Sign In </a>
    </div>
  {% endif %}
</div>
<ol>
{% for post in posts %}
  <div class="w3-panel w3-light-grey w3-leftbar w3-border-grey">
  <li><p><a href = "https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{{ post.url }}">{{ post.title }}</a></p>
  <p>{{ post.votes }} | Created {{ post.created_on }}| <a href = "https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"user_info' post.creator.username %}">{{ post.creator.username }}</a> | <a href="https://blog.finxter.com/how-i-added-more-views-to-the-hacker-news-clone-website/{% url"post' post.id %}"> {{ post.comments }} Comments</a></p></li>
</div>
{% endfor %}
</ol>
{% endblock %}

ייתכן שכל התבניות שיצרנו עד כה נראות דומות אך הן לא. זה מציג כל שדה שיצרנו במודל הפוסט בהתבסס על יוצר נתון. שוב, באמצעות מנוע תבנית Django ב- {% … %} ו {{ … }} בלוקים מפשט לנו הכל.

סיכום

עד כה, יצרנו חמש תצוגות עבור אתר האינטרנט של שיבוט האקר ניוז Django. ודא שאתה מייבא את המודולים והפונקציות המתאימים בחלק העליון של urls.py ו views.py קבצים. אתה תמיד יכול לבדוק את קוד מלא ב-GitHub.

קח את הזמן שלך לעבור על מה שעשינו. אם דברים מסוימים לא ברורים, אתה יכול לבדוק את התיעוד. כשנסיים את קידוד האפליקציה הזו, נבדוק הכל – לא ב- test.py קובץ – אלא על ידי איכלוס מסד הנתונים שלנו באמצעות מידע מאתר האקר ניוז.

אני מקווה שזה יעזור להבהיר כמה נקודות. נתראה בסדרה הבאה.

🔗 מוּמלָץ: איך קידדתי שיבוט של האקר חדשות ב-Django



קישור לכתבת המקור – 2023-07-05 18:17:39

Facebook
Twitter
LinkedIn
Telegram
WhatsApp
Email
פרסומת
תכנון תשתיות רפואיות

עוד מתחומי האתר