سلام شاید از قبل متوجه این موضوع شده باشید که وقتی فردی پاسخی را برای یک پست ارسال می کند فیلد last_update بروز رسانی نمی شود. حالا می خواهیم این مورد را درست کنیم. boards/views.py
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ |
@login_required def reply_topic(request, pk, topic_pk): topic = get_object_or_404(Topic, board__pk=pk, pk=topic_pk) if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): post = form.save(commit=False) post.topic = topic post.created_by = request.user post.save() topic.last_updated = timezone.now() # <- here topic.save() # <- and here return redirect('topic_posts', pk=pk, topic_pk=topic_pk) else: form = PostForm() return render(request, 'reply_topic.html', {'topic': topic, 'form': form}) |
کار بعدی که قصد انجام آن را داریم کنترل روی سیستم شمارندۀ بازدیدهاست. ما …
سلام یکی از ساده ترین راه ها برای اضافه کردن تصویر پروفایل استفاده از Gravatar است. داخل فولدر boards/templatetags فایلی با نام gravatar.py ایجاد می کنیم. boards/templatetags/gravatar.py
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ |
import hashlib from urllib.parse import urlencode from django import template from django.conf import settings register = template.Library() @register.filter def gravatar(user): email = user.email.lower().encode('utf-8') default = 'mm' size = ۲۵۶ url = 'https://www.gravatar.com/avatar/{md5}?{params}'.format( md5=hashlib.md5(email).hexdigest(), params=urlencode({'d': default, 's': str(size)}) ) return url |
در واقع من از کدی استفاده کرده ام که آن ها آماده کرده اند و صرفاً آن را با پایتون ۳ سازگار …
سلام برای اینکه برنامه همهفهمتر شود؛ پکیج هایی به صورت پیشفرض در جنگو ساخته شده است. برای مثال می خواهیم فیلد زمان و تاریخ را طبیعیتر کنیم. به جای اینکه تمام دیتای خود را نمایش دهیم؛ می نویسیم «دو دقیقه پیش» در اولین گام django.contrib.humanize را به INSTALLED_APPS اضافه می …
سلام می خواهیم از یک ویرایشگر Markdown خیلی باحال به اسم SimpleMD استفاده کنیم. در ابتدا یا کتابخانۀ جاوا اسکریپت آن را دانلود یا از CDNشان استفاده می کنیم.
۱ ۲ |
<link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css"> <script src="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js"></script> |
هم می توان دو خط بالا را به فایل base.html اضافه کرد و هم این دو فایل را دانلود کرده …
سلام می خواهیم تجربه کاربری را با اضافه کردن markdown به قسمت متنی (textarea) فرم بهبود دهیم. این کار بسیار ساده و آسان خواهد بود. ابتدا کتابخانه Python-Markdown را نصب می کنیم.
۱ |
pip install markdown |
حالا می خواهیم به مدل Post یک متد اضافه می کنیم. boards/models.py (مشاهده کد کامل)
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ |
from django.db import models from django.utils.html import mark_safe from markdown import markdown class Post(models.Model): # ... def get_message_as_markdown(self): return mark_safe(markdown(self.message, safe_mode='escape')) |
فقط …
سلام مشابه با آنچه در خصوص قالب form.html انجام شد؛ می توانیم تغییرات مشابهی را برای صفحه بندی و شماره گذاری صفحات انجام دهیم. برای این کار ابتدا صفحات پست های یک تاپیک را صفحه گذاری کرده و سپس دنبال راهی برای قابلیت استفاده مجدد در کامپوننت صفحه بندی پیدا …
سلام خیلی خوب! حالا نوبت آن رسیده تا آخرین ویوی برنامه را بروزرسانی کنیم. بعد از این کار صرفاً به بهبود ویوهای موجود می پردازیم. accounts/views.py (مشاهده کد کامل)
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ |
from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.urls import reverse_lazy from django.utils.decorators import method_decorator from django.views.generic import UpdateView @method_decorator(login_required, name='dispatch') class UserUpdateView(UpdateView): model = User fields = ('first_name', 'last_name', 'email', ) template_name = 'my_account.html' success_url = reverse_lazy('my_account') def get_object(self): return self.request.user |
myproject/urls.py (مشاهده کد کامل)
۱ ۲ ۳ ۴ ۵ ۶ ۷ |
from django.conf.urls import url from accounts import views as accounts_views urlpatterns = [ # ... url(r'^settings/account/$', accounts_views.UserUpdateView.as_view(), name='my_account'), ] |
templates/my_account.html
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ |
{% extends 'base.html' %} {% block title %}My account{% endblock %} {% block breadcrumb %} <li class="breadcrumb-item active">My account</li> {% endblock %} {% block content %} <div class="row"> <div class="col-lg-6 col-md-8 col-sm-10"> <form method="post" novalidate> {% csrf_token %} {% include 'includes/form.html' %} <button type="submit" class="btn btn-success">Save changes</button> </form> </div> </div> {% endblock %} |
ترجمۀ اختصاصی توسط تمدن مطلب بعدی: اضافه کردن Markdown مطلب قبلی: صفحه …
سلام در ادامه پیاده سازی مشابهی را و البته با استفاده از ListView می بینیم. boards/views.py (مشاهده کد کامل)
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ |
class TopicListView(ListView): model = Topic context_object_name = 'topics' template_name = 'topics.html' paginate_by = ۲۰ def get_context_data(self, **kwargs): kwargs['board'] = self.board return super().get_context_data(**kwargs) def get_queryset(self): self.board = get_object_or_404(Board, pk=self.kwargs.get('pk')) queryset = self.board.topics.order_by('-last_updated').annotate(replies=Count('posts') - ۱) return queryset |
تعامل با paginator در قالب برنامه متفاوت از روش عادی و مبتنی بر توابع است. در قالب، متغیرهای زیر قابل دسترسی اند: paginator, page_obj, is_paginated, object_list و همچنین متغیری که …
سلام کد زیر مربوط به پیاده سازی صفحه بندی با استفاده از توابع است. boards/views.py (مشاهده کد کامل)
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ |
from django.db.models import Count from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.shortcuts import get_object_or_404, render from django.views.generic import ListView from .models import Board def board_topics(request, pk): board = get_object_or_404(Board, pk=pk) queryset = board.topics.order_by('-last_updated').annotate(replies=Count('posts') - ۱) page = request.GET.get('page', ۱) paginator = Paginator(queryset, ۲۰) try: topics = paginator.page(page) except PageNotAnInteger: # fallback to the first page topics = paginator.page(۱) except EmptyPage: # probably the user tried to add a page number # in the url, so we fallback to the last page topics = paginator.page(paginator.num_pages) return render(request, 'topics.html', {'board': board, 'topics': topics}) |
حالا ترفند اصلی این است که صفحات را با استفاده از کامپوننت صفحه بندی در بوت استرپ ۴ نمایش دهیم. این کار زمان زیادی می برد و می توانید با مراجعه …
سلام این کار با استفاده از CBV بسیار آسان است. اما قبل از آن می خواهیم صفحه بندی مطالب را به صورت دستی انجام دهیم تا از مکانیسم واقعی آن آگاهی پیدا کنی و سپس از تکنولوژی CBV بهره برداری می کنیم. از الآن به بعد روی ویوی board_topics کار …