ترفندهای برنامه‌نویسی
163 subscribers
27 photos
3 videos
22 files
615 links
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
1.What is Udemy Coupon?

udemy coupon is a discount code which can be used to courses for 100% free which implies you will get enrolled in premium or paid courses without paying for it.
# pythonanywhere.com
خب سلام
احساس میکنم این پست هم لازم بود.
یکی از جاهایی که برای جنگو و فلسک امکان دپلوی رایگان میده و البته با یه سری محدودیت که در مقابل رایگان بودنش قابل چشم پوشی هست(همینم غنیمته)، سایت
pythonanywhere.com
هست، ولی برای دفعه اول کار کردن با محیطش یکمی پیچیده هست. سعی میکنم توضیح مناسبی برای نحوه کارش بهتون ارائه بدم:
بعد از اینکه پروژه خودتون رو روی این سایت قرار دادین(به صورت فایل زیپ، یا کلون از گیت یا...)
یه محیط مجازی venv میسازید.
خب همه چیز آماده هست پس بریم سراغ ران کردن.
اول وارد تب web میشین، و حالا باید فیلدهای زیر رو تنظیم کنید:
Source code:
اینجا باید آدرس پوشه‌ای که فایل settings.py داخلش هست رو بنویسید برای مثال:
تقریبا هم این استایل بجز اسم پوشه‌ی آخر ثابت هست:
/home/your_username/settings-py_dir

آیتم بعدی Working directory: هست که اون هم پوشه‌ای میشه که همه چیز داخلش هست، مثل پروژه‌ی شما و اون پوشه venv. ادرسش هم این میشه:
/home/your_username

و آیتم بعدی WSGI configuration file: که اینجا یه فایلی خودش نوشته شده و با کلیک روی اون اسم وارد یه محیط ادیتور میشین و حالا باید اون متن رو درست ویرایش کنید تا پروژه رو ران کنید.
برای ویرایش اون فایل قسمتی که با
# **** Dajngo *****
مشخص شده رو باید از حالت کامنت خارج کنید. بعد باید متنش رو تغییر بدین:
اولین چیز path: هست. آدرس پوشه‌ای که فایل manage.py داخلش هست رو بهش بدین.(احتمالا هم همون
/home/your_username
میشه).
ایتم بعدی برای تنظیم توی این فایل قسمت
os.environ.... = ' '
هست. اینجا باید فایل settings رو لود کنید. خب یبار path رو مقدار دادیم. حالا از path اگر بخوایم به فایل settings برسیم، اسم چندتا پوشه باید نوشته بشه؟(بستگی به پروژه‌ی شما داره) ولی برای مثال:
'settings-py_dir.settings'
برای من بود.
! بجای settings-py_dir اسم پوشه‌ها رو به ترتیب بنویسید و با نقطه پوشه‌ی بعدی رو اضافه کنید.
خب کار با این فایل تمومه فقط با زدن روی دکمه save که با رنگ سبز مشخص هست توی صفحه، ذخیره‌ش کنید.
دکمه بک رو بزنید و وارد قسمت قبلی بشین(تب web)
ایتم Virtualenv: رو باید تنظیم کنیم، که ادرس پوشه محیط مجازی رو بهش میدین
/home/username/venv

قسمت لاگ‌فایلز رو کاری لازم نیست باهاش بکنید ولی این رو بدونید که یه سیستم لاگ گیری خوب هست، هر جایی که پروژه به مشکلی خورد، میتونید روی اون لینک‌ها کلیک کنید و بعد لاگ ها رو مرور کنید تا متوجه بشین چی با مشکل روبه‌رو شده و یه کمک خوب گیرتون میاد.
مورد بعدی برای تنظیم کردن، Static files: هست. آدرس پوشه‌ای که فایل های استاتیک پروژه‌تون داخلش هست رو میدین(اگر از قبل فایلها رو یکجا جمع نکردین و توی اپ‌ها پخش هستن با تنظیم ادرس برای SATATIC_ROOT و بعد اجرای دستور
python manage.py collectstatics
اونها رو یجا جمع کنید. البته اینکارو روی لوکال هاست خودتون بکنید و بعد پروژه رو جابجا کنید).
یه مقدار url میخواد که اگر دستکاریش نکردین توی settings همون /static/ هست، و یه مقدار برای ادرس پوشه که برای مثال
/home/username/assets

خب اینها رو تنظیم کنید و برگردین بالای صفحه و روی دکمه سبز رنگ ری‌لود کلیک کنید و یکم صبر کنید. حالا زیر
Configuration for
اسم پروژه‌ی شما روی این سایت نوشته شده روش کلیک کنید و وارد سایت خودتون بشین و امیدوارم که همون بار اول همه چیز درست پیش بره✌️.
آی‌دی کانال👇
programming_tricks
برای اسلاگ فارسی:
slug = models.SlugField(max_length=100, allow_unicode=True, unique_for_date='publish')
publish = models.DateTimeField(verbose_name=_("Publish"),
default=timezone.now)
و توی urls.py هم به این شکل:
paht(blogs/<str:slug>/....
# اینجا از str استفاده شده چون slug به کاراکترهای فارسی گیر میده و کارنمیکنه.
*! نکته‌ای که جا موند:
چون از str استفاده کردیم پس الان اون کلیدی که توی kwargs به views فرستاده شده از نوع str هست ولی ما به نوع slug نیاز داریم، درنتیجه توی ویو باید یه تغییر تایپ روش انجام بدیم و اینکار رو با تابع slugify جنگو انجام میدیم به این صورت:
slug=slugify(kwargs['slug'], allow_unicode=True),
همچین اگر میخواین از تایتل برای اسلاگ استفاده کنید توی ادمین این مدل همچین فیلدی لازم دارین:
class PostAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('title',)}
اگر میخواین مطمئن باشید هرجایی از این مدل یه ابجکت جدید ساخته شد، خارج از پنل ادمین میتونید از اورراید تابع سیو استفاده کنید:
def save(self, *args, kwargs):
if not self.slug:
self.slug = slugify(self.title, allow_unicode=True)
return super().save(*args, kwargs)
بعضی از چیزها هم جزء تریک‌ها هستن ولی خب اسمشون واضحه ;)
یه عادت که میتونه بعدا کمک کنه کدهای کمتری بنویسیم اینه که یکم بیشتر کد بنویسیم ؛).
توی پایتون میتونیم توابع رو به صورت:
def func(x, y, *args, **kwargs):

تعریف کنیم، اما یکم بهتر و قشنگتر اینه که اینجوری بنویسیم:
def func(x:int, y:list, *args, **kwargs)-> boolean:
اینجا کسی که تابع رو تعریف کرده کاربری که میخواد از تابع استفاده کنه مجبور میکنه حتما x, y رو به تابع بده درضمن برای راهنمایی بیشتر تعیین کرده کدهایی که توی تابع هستن انتظار دارن تایپ یا همون نوع x, y چی باشه و در ادامه قبل از : (کولون) مشخص کرده که این تابع یه پاسخ از نوع بولین(True/False) قراره برگردونه. ولی

*args, **kwargs
چی هستن؟ این دوتا به تابع این امکان رو اضافه میکنه که بی‌نهایت ورودی بپذیره، اما خب باهمدیگه فرق دارن و فرق شون هم اینه که آرگز یه لیست از آرگومان‌ها هست و استاری(*) که بعدش اومده اون رو باز کرده!
یعنی چی؟ ببینید یه لیست همیشه اعضاش داخل یه قلاب باز و بسته هستن. ([ ]) اما خب ما اونجا توی آرگومان‌های تابع اعضای لیست آرگز رو با گذاشتن ستاره از این قلاب بیرون میاریم:
args = [1, 2, 3] -> *args = 1, 2, 3
خب. حالا نوبت kwargs شد. این یکی یه دیکشنری هست و برای بیرون کشیدن عناصر یه دیکشنری از کرلی‌براکت یا آکولاد از دوتا ستاره استفاده میشه:
kwargs = {'first': 1, 'second': 2}
y = kwargs
x = **kwargs
y['first'] = 3
الان نتیجه پرینت‌های بعدی جالبه:
print(y)
Out: {'first': 3, 'second': 2}

print(kwargs)
Out: {'first': 3, 'second': 2}

print(x)
Out: {'first': 1, 'second': 2}
همونطور که متوجه شدین با استفاده از دوتا ستاره فقط اعضای دیکشنری kwargs رو استخراج کردم و باهاشون یه دیکشنری جدید ساختم. اما وقتی y رو مساوی kwargs بذاریم درواقع هم y و kwargs دارن به یه محل از حافظه که اون دیکشنری که اول اسمش رو kwargs گذاشتم ذخیره شده اشاره میکنن به این حالت اشاره‌کردن pointer هم میگن.
البته این خودش یه نکته‌ای رو به یادم آورد. توی پایتون متغییرهای درواقع پوینتر هستن و باید حواستون باشه که مثلا با x=a نوشتن x یه متغییر جدید نیست بلکه همون a هست که اسمش عوض شده!. توی کدها تغییر دادن x در آینده a روهم تغییر میده.
اما این برای همه صدق نمیکنه و بعدا یه پست دیگه براش می‌نویسم.
فعلا میخواستم بگم توی جنگو هم کدهای پایتون می‌نویسیم پس میتونید تابع‌هاتون رو به صورت
def func(request, *args, **kwargs):
تعریف کنید و از
slug=kwargs['slug']
استفاده کنید. یا چک کنید که:
if 'slug' in kwargs.keys():

راستی یادم رفت بگم چرا بعدا باعث کدنویسی کمتر میشه!
بخاطر اینکه شما یه تابع با قابلیت پذیرش آرگومان ورودی بیشتری میسازین و تابع شما جاهایی که میشه استفادش کرد بیشتر میشه. همون بحث dry یا:
Don't repeat yourself!
li1 = [1,4, 3]
li2 = [6, 5, 7]
li3 = [*li1, *li2] -» print(li3) => [1, 4, 3, 6, 5, 7]
*اینجا ترتیب عناصر لیست‌ها حفظ میشه. هم ترتیب اینکه اول اعضای کدوم لیست قرار بگیرن، هم ترتیبی که اعضای هر لیست تو اون لیست داشتن حفظ میشه!.

d1 = {'a': 1, 'b':2}
d2 = {'c': 1, 'd':2}
d3 = {**d1, **d2} -» print(d3) => {'a': 1, 'c': 1, 'd':2, 'b':2}
*توی دیکشنری هم که ترتیب معنی نداره! ولی نکته‌ اینه: یه دیکشنری رو باید حتما توی یه دیکشنری دیگه استخراج کنید وگرنه ارور میده.
سلام دوستان
یکی از چیزهای باحالی که توی جنگو و خصوصا پنل ادمین هست، tabular_inline هست. وقتی دوتا مدل داریم که a,b هستن و b یه فیلدش یه رابطه به a هست توی admin.py میتونیم کلاسی تعریف کنیم که از b یک tabular inline بسازیم، و بعد توی کلاس مدل‌ادمین a بیام و اون کلاس خاص رو توی inline ها اضافه کنیم.
نتیجه‌ی اینکار میشه یه پنل نواری که توی پنل‌ادمین مدل a اضافه میشه و وقتی داریم یه ابجکت از مدل a اضافه یا ویرایش میکنیم، آبجکت‌های مدل b که باهاش رابطه دارن رو هم میتونیم اضافه یا ویرایش کنیم. (توی عکس قسمت سفارش های فاکتور)
اینم لینک داکیومنتش
https://docs.djangoproject.com/en/3.1/ref/contrib/admin/#inlinemodeladmin-objects

@programming_tricks
ترفندهای برنامه‌نویسی
سلام دوستان یکی از چیزهای باحالی که توی جنگو و خصوصا پنل ادمین هست، tabular_inline هست. وقتی دوتا مدل داریم که a,b هستن و b یه فیلدش یه رابطه به a هست توی admin.py میتونیم کلاسی تعریف کنیم که از b یک tabular inline بسازیم، و بعد توی کلاس مدل‌ادمین a بیام و…
اما حالا اگر بخواهیم همین کار رو توی یک فرمی که خودمون میسازیم داشته باشیم چی؟
اینجا جنگو یه چیزهایی داره که توی لینک زیر بهشون اشاره شده.
https://docs.djangoproject.com/en/3.1/topics/forms/formsets/
ولی باز اینجا یه نکته‌ای وجود داره و اونم اینکه جنگو نگفته چجوری میتونیم فرم‌ست‌ها رو مثل چیزی که خودش توی پنل ادمین داره، اضافه یا کم کنیم؟
یعنی به صورت یه دکمه برای اضافه یا کم کردنشون چیزی نداریم.
خب من یه روشی برای اینکار پیدا کردم:
https://gist.github.com/mh-firouzjaah/dc707b802617e517326582b6b9ffc363

@programming_tricks
مدل‌فرم یک فرم براساس فیلدهایی که توی کلاس مدل تعریف شده ایجاد میکنه، و is_valid هم باز براساس همون فیلدها ولیدیشن چک میکنه.
به صورت دیفالت وقتی مثلا از charfield استفاده کردی و max_length تعریف کردی، یا باقی محدودیت‌هایی که تعریف کردی یا جنگو پیش‌فرض تعریف کرده(چون داری از فیلدی که جنگو تعریف کرده استفاده میکنی دیگه) و حتی اگر توی فیلد مدل بیای و validators هم تعریف کنی، همه‌ی اینها رو مدل‌فرم تشخیص میده و توی فیلدهای فرمش درنطر میگیره و تابع is_valid هم بر همین اساس ولید بودن رو بررسی میکنه. و همچنین تابع save توی form.save میاد بعد از ولید بودن آبحکت جدید از مدلت میسازه و ذخیره می‌کنه.
درحالیکه forms.Form مدلی نداره و درنتیجه is_valid بر اساس هرچیزی که توی فیلدهای فرمت تعریف بکنی، بررسی‌ها رو انجام میده و تابع save هم نداره چون مدل نداره!.

درباره‌ی اینکه فرم‌های جنگو چه کاربرد دیگه‌ای میتونن داشته باشن، یه نکته‌ی جالبی وجود داره و اینه که جنگو رست‌فریم‌ورک اومده و از نحوه‌ی کار این فرم‌ها خیلی الهام گرفته!
@programming_tricks
To list the packages marked for upgrade with their download size

$ expac -S -H M '%k\t%n' $(pacman -Qqu) | sort -sh
@programming_tricks
اگر یوزر قراره دستکاری بشه، بهتره اول پروژه و قبل از اولین مایگریشن اینکار انجام بشه.
داک جنگو میگه بهتره کلا توی پروژه‌های جدیدتون، همون اول همچین چیزی رو بنویسید، بذارید یک گوشه:
If you’re starting a new project, it’s highly recommended to set up a custom user model, even if the default User model is sufficient for you. This model behaves identically to the default user model, but you’ll be able to customize it in the future if the need arises:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
pass

Don’t forget to point AUTH_USER_MODEL to it. Do this before creating any migrations or running manage.py migrate for the first time.

Also, register the model in the app’s admin.py:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

admin.register(User)
class CustomUserAdmin(UserAdmin):
fieldsets = (
*UserAdmin.fieldsets,
'''
('Custom Field Heading',{'fields': ('garrison',),},),
'''
)

ولی نکته‌ی نگفته‌ش اینه که، حالا اینکارو نکردین، چیکار کنید؟
اگر میخواین وسط کار مدل یوزر خودتون رو درست کنید، میاین قبل از اینکه مدل جدید رو بسازین، یا حداقل اپی که مدل جدید توشه رو توی INSTALLED_APPS وارد کنید، این کد رو بزنید:
python manage.py migrate auth zero
با اینکار، اون مدل یوزر پیش‌فرض رو از مایگریشن پاک میکنه، حالا اپ و یا مدل جدید رو درست کنید و AUTH_USER_MODEL به این مدل ست کنید، و مایگریشن بزنید.
@programming_tricks
How to clear journalctl logs

journalctl --rotate
journalctl --vacuum-time=1s

@programming_tricks
Star imports (also called wildcard imports), such as from
PyQt5.QtWidgets import *
, are convenient and often seen in tutorials, but, in practice, they are best avoided. Doing this with a PyQt module will fill your namespace with hundreds of classes, functions, and constants, any of which you might accidentally overwrite with a variable name. Avoiding star imports will also help you to learn which modules contain which commonly used classes.

@programming_tricks
ترفندهای برنامه‌نویسی
Star imports (also called wildcard imports), such as from PyQt5.QtWidgets import *, are convenient and often seen in tutorials, but, in practice, they are best avoided. Doing this with a PyQt module will fill your namespace with hundreds of classes, functions…
این مطلب دلیل اینکه درست کد بنویسیم تا از بروز مشکلات احتمالی جلوگیری کنیم. تایپ کردن چندتا کلمه بیشتر هیچ ضرری نداره!
@programming_tricks
خب در ادامه‌ی تریک‌های جنگو
حتما پیش‌اومده که دیده باشین یا خواسته باشین یه قسمت‌هایی از ویوی پنل ادمین برای یه مدل رو کولپس کنید، مثلا تعدادی فیلد که پشت‌سرهم هستن ولی پرکردن‌شون اجباری نیست. میخوام یه روش برای کولپس کردن این فیلدها بگم:
'classes': ('collapse',),
ولی این چیه و کجا باید نوشته بشه؟
توی کلاس مدل‌ادمین مدل موردنظر میاد و fieldsets رو مینویسید و داخل فیلدست هم اون متن بالا رو قرار میدین. برای نمونه همون‌کاری که توی چندتا پست‌قبل‌تر با مدل یوزر پیش‌فرض جنگو کرده بودم، یا:
@admin.register(Document)
class DocumentAdmin(admin.ModelAdmin):
fieldsets = (
(_("Title"), {
"fields": (
"title",
),
}),
(_("Title translation"), {
"fields": (
'title_fa', 'title_en'
),
'classes': ('collapse',),
}),
اینجا من دوتافیلد اضافی برای تایتل داشتم که برای بحث ترجمه و دردسترس بودن سایت به دو زبان فارسی و انگلیسی استفاده شدن ولی میشد اونها رو پر نکرد. برای اینکه صفحه پنل ادمین زیادی شلوغ نباشه. این دوتا فیلد رو دسته‌بندی کردم و کولپس کردم.
@programming_tricks
How to discover which variables are available in a Django template | 20tab's blog | Development & Growth Marketing
https://www.20tab.com/en/blog/how-discover-which-variables-django-template/
سلام
این یک فریم‌ورک سی‌ا‌س‌اس سطح پایین و بدون جاوااسکریپت هست. البته منظورم از بدون جاوااسکریپت اینه که مثل بوت‌استرپ یا متریال‌دیزاین نیازی نداره که جی‌کوئری یا کتابخانه‌های جاوااسکریپتی دیگه‌ای باشن تا کار کنه، فقط سی‌ا‌س‌اس خالی هست.
اما خب برای استفاده حداکثری از قابلیت‌هاش باید با npm نصب بشه و درواقع یبار بیلد بشه تا حجم کار نهایی کم بشه و خب در طول پیش‌بردن پروژه بتونید ازش خوب کمک بگیرید.
این دوره‌ی آموزشی رایگان رو یوتیوب هست و استادش البته دوره‌های دیگری هم داشتن که سطحشون خوبه
البته اول زبان انگلیسی رو باید خوب یادبگیرید.
https://youtu.be/aNmBiqK2uQ0
سلام دوستان
قصد دارم یه دوره‌ی آموزشی کوتاه درباره‌ی طراحی وب‌سایت با فریم‌ورک جنگو ضبط کنم.
هدف این مجموعه طراحی وب‌سایت دو زبانه یا multi lingual هست.
وب‌سایتی که کاربر می‌تونه دو نسخه فارسی یا انگلیسی از یک صفحه رو ببینه.
درصورتی که فکر میکنید این آموزش میتونه مفید باشه، و اگر نظری درباره‌ی کیفیت صدا یا تصویر دارین لطفا در کامنت‌ها درج کنید.

https://youtu.be/iyt3iBtlQeE