alert.html
839 B
یکی از کامپوننتهای جالب که استفاده کردنش به زیبایی کار اضافه میکنه همین فایل هست.
با استفاده از کتابخانه messages خود جنگو میشه پیغامهایی برای یوزر ارسال کرد، این فایل برای نمایش اون پیامها در تمپلیت استفاده میشه.
نکتهای دیگهش استفاده از include هست. این فایل توی base.html اسمش include شده.
@programming_tricks
با استفاده از کتابخانه messages خود جنگو میشه پیغامهایی برای یوزر ارسال کرد، این فایل برای نمایش اون پیامها در تمپلیت استفاده میشه.
نکتهای دیگهش استفاده از include هست. این فایل توی base.html اسمش include شده.
@programming_tricks
pagination.html
4.6 KB
از دیگر کامپوننت های اچتیامالی که میشه یبار نوشت، ولی چندین بار توی فایلها و صفحات مختلف ازش استفاده کرد، pagination هست.
این فایلی که اینجا هست، بر اساس همون توضیحات داکیومنت جنگو هست ولی با یک فرق بسیار مهم!
اونیکه توی داک جنگو هست، برای همهی صفحات شماره میذاره که یعنی اگر ۱۰۰ تا هم بشه، همهی از یک تا صد رو براش دکمه میذاره و صفحهی شما زشت میشه.
ولی اینجا این فایل آماده شده تا صفحه اول، آخر و چندتا شماره نسبت به صفحهی فعلی که یوزر میبینه رو نمایش بده.
@programming_tricks
این فایلی که اینجا هست، بر اساس همون توضیحات داکیومنت جنگو هست ولی با یک فرق بسیار مهم!
اونیکه توی داک جنگو هست، برای همهی صفحات شماره میذاره که یعنی اگر ۱۰۰ تا هم بشه، همهی از یک تا صد رو براش دکمه میذاره و صفحهی شما زشت میشه.
ولی اینجا این فایل آماده شده تا صفحه اول، آخر و چندتا شماره نسبت به صفحهی فعلی که یوزر میبینه رو نمایش بده.
@programming_tricks
سلام به شما
https://django-simple-captcha.readthedocs.io/en/latest/usage.html
یه پکیج جالب پیدا کردم، کارش اینه که captcha درست کنه.
برای لاگین فرم پنل ادمین هم اضافهش کردم، به این صورت:
توی admin.py یه اپ که ساختم برای کاستوم کردن مدل یوزر(که بعدا این رو هم یک متنی راجع بهش مینویسم). این ها رو اضافه کردم.
ولی شما میتونید توی admin.py هر اپ دیگری هم اینکار رو بکنید.
@programming_tricks
https://django-simple-captcha.readthedocs.io/en/latest/usage.html
یه پکیج جالب پیدا کردم، کارش اینه که captcha درست کنه.
برای لاگین فرم پنل ادمین هم اضافهش کردم، به این صورت:
توی admin.py یه اپ که ساختم برای کاستوم کردن مدل یوزر(که بعدا این رو هم یک متنی راجع بهش مینویسم). این ها رو اضافه کردم.
ولی شما میتونید توی admin.py هر اپ دیگری هم اینکار رو بکنید.
admin.autodiscover()
admin.site.login = custom_views.CustomLoginView.as_view()
اینجا custom_views یه فایل views هست توی یه اپ که داخلش این کلاس قرار داره:from django.contrib.auth.views import LoginView
from django.contrib.messages.views import SuccessMessageMixin
from . import forms
class CustomLoginView(SuccessMessageMixin, LoginView):
template_name = 'admin/login-1.html'
success_message = ('خوش آمدید، ورود شما موفقیت آمیز بود.')
authentication_form = forms.CustomLoginForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["username"] = self.request.user.username
return context
اون فرم هم این بوده:from captcha.fields import CaptchaField
from django.contrib.auth.forms import AuthenticationForm
class CustomLoginForm(AuthenticationForm):
captcha = CaptchaField()
خب بعدش باید تمپلیت مورد نیاز رو هم درست کنیم. من فقط از تمپلیت جنگو یه کپی گرفتم و اسمش رو عوض کردم و داخلش هم این چندخط به بالای دکمه ثبت، اضافه کردم:<div class="form-row">
{{ form.captcha.errors }}
{{ form.captcha.label_tag }}
{{ form.captcha }}
</div>
به همین آسونی میشه صفحه لاگین پنل ادمین رو دستکاری کرد و البته یه کپچای کوچیک هم بهش اضافه کرد.@programming_tricks
کتابهای رایگان برنامهنویسی پایتون:
- Object Oriented Design in Python
- Wikibooks' Non-Programmers Tutorial for Python 3
- The Official Python Tutorial
- A Byte of Python (Swaroop C H.)
- Problem Solving with Algorithms and Data Structures using python (Brad Miller and David Ranum)
- Dive into Python 3
- Invent Your Own Computer Games With Python (Al Sweigart)
- Making Games with Python & Pygame (Albert Sweigart)
- Natural Language Processing with Python (Steven Bird, Ewan Klein, and Edward Loper)
- Python Bibliotheca
- Python for Fun (Chris Meyers)
- Snake Wrangling For Kids (Jason R. Briggs)
- Think Python (PDF file) (Allen Downey)
- Think Python 3 (Allen Downey)
- Automate the Boring Stuff with Python (Al Sweigart)
- Python® Notes for Professionals book(GoalKicker)
- Python Practice Book(Anand Chitipothu)
آموزشهای تعاملی پایتون:
- Coursera - Online course for introduction to interactive Python programming
- CheckiO - A game world you can explore, using your Python programming skills
- PyCharm Edu - A desktop application that offers interactive Python learning
- Interactive Python - Includes a modified, interactive version of How to Think Like a Computer Scientist
دورههای ویدئویی رایگان:
- Python Basics (Sentdex)
- Intermediate Python Fundamentals (Sentdex)
- Sockets Tutorial with Python 3 (Sentdex)
- Python Requests (Pretty Printed)
- Python 3 Tutorial for Begginers (The Net Ninja)
- Python Tutorials (Corey Schafer)
- Python OOP Tutorials - Working with Classes (Corey Schafer)
کتابهای فارسی رایگان برنامهنویسی پایتون:
- تفکر پایتونی ( Think Python )
- کتاب آزاد آموزش پایتون ( Coderz )
دورههای ویدئویی فارسی:
- آموزش زبان پایتون (ParsClick)
- آموزش برنامه نویسی با پایتون (GoToClass, جادی)
- برنامهنویسی با پایتون (پیشرفته) (Maktabkhooneh, جادی) 💰
- Object Oriented Design in Python
- Wikibooks' Non-Programmers Tutorial for Python 3
- The Official Python Tutorial
- A Byte of Python (Swaroop C H.)
- Problem Solving with Algorithms and Data Structures using python (Brad Miller and David Ranum)
- Dive into Python 3
- Invent Your Own Computer Games With Python (Al Sweigart)
- Making Games with Python & Pygame (Albert Sweigart)
- Natural Language Processing with Python (Steven Bird, Ewan Klein, and Edward Loper)
- Python Bibliotheca
- Python for Fun (Chris Meyers)
- Snake Wrangling For Kids (Jason R. Briggs)
- Think Python (PDF file) (Allen Downey)
- Think Python 3 (Allen Downey)
- Automate the Boring Stuff with Python (Al Sweigart)
- Python® Notes for Professionals book(GoalKicker)
- Python Practice Book(Anand Chitipothu)
آموزشهای تعاملی پایتون:
- Coursera - Online course for introduction to interactive Python programming
- CheckiO - A game world you can explore, using your Python programming skills
- PyCharm Edu - A desktop application that offers interactive Python learning
- Interactive Python - Includes a modified, interactive version of How to Think Like a Computer Scientist
دورههای ویدئویی رایگان:
- Python Basics (Sentdex)
- Intermediate Python Fundamentals (Sentdex)
- Sockets Tutorial with Python 3 (Sentdex)
- Python Requests (Pretty Printed)
- Python 3 Tutorial for Begginers (The Net Ninja)
- Python Tutorials (Corey Schafer)
- Python OOP Tutorials - Working with Classes (Corey Schafer)
کتابهای فارسی رایگان برنامهنویسی پایتون:
- تفکر پایتونی ( Think Python )
- کتاب آزاد آموزش پایتون ( Coderz )
دورههای ویدئویی فارسی:
- آموزش زبان پایتون (ParsClick)
- آموزش برنامه نویسی با پایتون (GoToClass, جادی)
- برنامهنویسی با پایتون (پیشرفته) (Maktabkhooneh, جادی) 💰
لیست پلاگینها و تنظیمات vscode برای برنامهنویسی و پایتون و جنگو و ویو-جیاس
احتمالا تنظمیات بهتری هم سراغ دارین و خب لطف میکنید اگر به اشتراک بذارید تا مطلب رو بروز رسانی کنم.
توی این لینک همهی پلاگینها و تنظیمات هستن:
https://gist.github.com/mh-firouzjaah/56bd7683936112c52131aae637815df3
برای اینکه تنظیمات رو وارد کنید توی ویاسکد به قسمت settings برید و بعد توی لیست دنبال Edit in settings.json بگردین و با کلیک روش وارد یه فایل جیسون میشین، تنظیمات رو اونجا کپی کنید.
اینجا هم فونتهایی که برای کدنویسی استفاده میشن قرار دادم، روی ویندوز و لینوکس نصب میشن(روی مک رو خودتون تست کنید.) فونت پیشنهادیم CascadiaCode هست.
https://github.com/mh-firouzjaah/coding-fonts
در vscode و خیلی از ادیتورهای دیگه افزونهی kite قابل نصب هست، برای پایتون و جاوااسکریپت یکی از افزونههای خوب به شمار میره، برای نصب و راه اندازیش علاوهبر پلاگین باید یه فایل دیگه رو از سایتش بگیرید و نصبش کنید، مشکلی که اونجا پیش میاد تحریم بودن کشور ما هست. البته سایتش رو میتونید بدون مشکل باز کنید ولی فایلی که دانلود میکنید دوباره به اتصال اینترنت و دانلود فایلهای دیگری داره که این بار به تحریما میخوره، من با استفاده از شکن تونستم نصبش کنم و الان داره کار میکنه.
برای کار با شکن توی سایتشون توضیح دادن که چیکار کنید ولی اگر لینوکس دارین:
sudo vim /etc/resolv.conf
و ادرسها رو paste کنید اینجا و بعدش هم برای خروج از vim اول دکمه Esc رو بزنید و بعدش هم علامت کولون یا : رو بزنید و بعد wq بنویسید و اینتر کنید.
برای من بعد از ریاستارت کردن سیستم این فایل خالی میشه و این تنظیمات ازبین میرن پس جای نگرانی نیست.
@programming_tricks
احتمالا تنظمیات بهتری هم سراغ دارین و خب لطف میکنید اگر به اشتراک بذارید تا مطلب رو بروز رسانی کنم.
توی این لینک همهی پلاگینها و تنظیمات هستن:
https://gist.github.com/mh-firouzjaah/56bd7683936112c52131aae637815df3
برای اینکه تنظیمات رو وارد کنید توی ویاسکد به قسمت settings برید و بعد توی لیست دنبال Edit in settings.json بگردین و با کلیک روش وارد یه فایل جیسون میشین، تنظیمات رو اونجا کپی کنید.
اینجا هم فونتهایی که برای کدنویسی استفاده میشن قرار دادم، روی ویندوز و لینوکس نصب میشن(روی مک رو خودتون تست کنید.) فونت پیشنهادیم CascadiaCode هست.
https://github.com/mh-firouzjaah/coding-fonts
در vscode و خیلی از ادیتورهای دیگه افزونهی kite قابل نصب هست، برای پایتون و جاوااسکریپت یکی از افزونههای خوب به شمار میره، برای نصب و راه اندازیش علاوهبر پلاگین باید یه فایل دیگه رو از سایتش بگیرید و نصبش کنید، مشکلی که اونجا پیش میاد تحریم بودن کشور ما هست. البته سایتش رو میتونید بدون مشکل باز کنید ولی فایلی که دانلود میکنید دوباره به اتصال اینترنت و دانلود فایلهای دیگری داره که این بار به تحریما میخوره، من با استفاده از شکن تونستم نصبش کنم و الان داره کار میکنه.
برای کار با شکن توی سایتشون توضیح دادن که چیکار کنید ولی اگر لینوکس دارین:
sudo vim /etc/resolv.conf
و ادرسها رو paste کنید اینجا و بعدش هم برای خروج از vim اول دکمه Esc رو بزنید و بعدش هم علامت کولون یا : رو بزنید و بعد wq بنویسید و اینتر کنید.
برای من بعد از ریاستارت کردن سیستم این فایل خالی میشه و این تنظیمات ازبین میرن پس جای نگرانی نیست.
@programming_tricks
Gist
on a linux `code --list-extensions | xargs -L 1 echo code --install-extension > vscode-extensions.sh` will export the extensions…
on a linux `code --list-extensions | xargs -L 1 echo code --install-extension > vscode-extensions.sh` will export the extensions name to a bash file then simply by executing that file the v...
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from Ultimate Freemium Courses
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.
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
خب سلام
احساس میکنم این پست هم لازم بود.
یکی از جاهایی که برای جنگو و فلسک امکان دپلوی رایگان میده و البته با یه سری محدودیت که در مقابل رایگان بودنش قابل چشم پوشی هست(همینم غنیمته)، سایت
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
برای اسلاگ فارسی:
*! نکتهای که جا موند:
چون از str استفاده کردیم پس الان اون کلیدی که توی kwargs به views فرستاده شده از نوع str هست ولی ما به نوع slug نیاز داریم، درنتیجه توی ویو باید یه تغییر تایپ روش انجام بدیم و اینکار رو با تابع slugify جنگو انجام میدیم به این صورت:
slug = models.SlugField(max_length=100, allow_unicode=True, unique_for_date='publish')و توی urls.py هم به این شکل:
publish = models.DateTimeField(verbose_name=_("Publish"),
default=timezone.now)
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)
بعضی از چیزها هم جزء تریکها هستن ولی خب اسمشون واضحه ;)یه عادت که میتونه بعدا کمک کنه کدهای کمتری بنویسیم اینه که یکم بیشتر کد بنویسیم ؛).
توی پایتون میتونیم توابع رو به صورت:
یعنی چی؟ ببینید یه لیست همیشه اعضاش داخل یه قلاب باز و بسته هستن. ([ ]) اما خب ما اونجا توی آرگومانهای تابع اعضای لیست آرگز رو با گذاشتن ستاره از این قلاب بیرون میاریم:
البته این خودش یه نکتهای رو به یادم آورد. توی پایتون متغییرهای درواقع پوینتر هستن و باید حواستون باشه که مثلا با x=a نوشتن x یه متغییر جدید نیست بلکه همون a هست که اسمش عوض شده!. توی کدها تغییر دادن x در آینده a روهم تغییر میده.
اما این برای همه صدق نمیکنه و بعدا یه پست دیگه براش مینویسم.
فعلا میخواستم بگم توی جنگو هم کدهای پایتون مینویسیم پس میتونید تابعهاتون رو به صورت
استفاده کنید. یا چک کنید که:
راستی یادم رفت بگم چرا بعدا باعث کدنویسی کمتر میشه!
بخاطر اینکه شما یه تابع با قابلیت پذیرش آرگومان ورودی بیشتری میسازین و تابع شما جاهایی که میشه استفادش کرد بیشتر میشه. همون بحث dry یا:
توی پایتون میتونیم توابع رو به صورت:
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 بیام و اون کلاس خاص رو توی 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
اینجا جنگو یه چیزهایی داره که توی لینک زیر بهشون اشاره شده.
https://docs.djangoproject.com/en/3.1/topics/forms/formsets/
ولی باز اینجا یه نکتهای وجود داره و اونم اینکه جنگو نگفته چجوری میتونیم فرمستها رو مثل چیزی که خودش توی پنل ادمین داره، اضافه یا کم کنیم؟
یعنی به صورت یه دکمه برای اضافه یا کم کردنشون چیزی نداریم.
خب من یه روشی برای اینکار پیدا کردم:
https://gist.github.com/mh-firouzjaah/dc707b802617e517326582b6b9ffc363
@programming_tricks
Gist
there's not a good solution for multiple django formset instances, so I had to try mine
there's not a good solution for multiple django formset instances, so I had to try mine - django multiple formset add or remove
مدلفرم یک فرم براساس فیلدهایی که توی کلاس مدل تعریف شده ایجاد میکنه، و is_valid هم باز براساس همون فیلدها ولیدیشن چک میکنه.
به صورت دیفالت وقتی مثلا از charfield استفاده کردی و max_length تعریف کردی، یا باقی محدودیتهایی که تعریف کردی یا جنگو پیشفرض تعریف کرده(چون داری از فیلدی که جنگو تعریف کرده استفاده میکنی دیگه) و حتی اگر توی فیلد مدل بیای و validators هم تعریف کنی، همهی اینها رو مدلفرم تشخیص میده و توی فیلدهای فرمش درنطر میگیره و تابع is_valid هم بر همین اساس ولید بودن رو بررسی میکنه. و همچنین تابع save توی form.save میاد بعد از ولید بودن آبحکت جدید از مدلت میسازه و ذخیره میکنه.
درحالیکه forms.Form مدلی نداره و درنتیجه is_valid بر اساس هرچیزی که توی فیلدهای فرمت تعریف بکنی، بررسیها رو انجام میده و تابع save هم نداره چون مدل نداره!.
دربارهی اینکه فرمهای جنگو چه کاربرد دیگهای میتونن داشته باشن، یه نکتهی جالبی وجود داره و اینه که جنگو رستفریمورک اومده و از نحوهی کار این فرمها خیلی الهام گرفته!
@programming_tricks
به صورت دیفالت وقتی مثلا از 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:
Also, register the model in the app’s admin.py:
اگر میخواین وسط کار مدل یوزر خودتون رو درست کنید، میاین قبل از اینکه مدل جدید رو بسازین، یا حداقل اپی که مدل جدید توشه رو توی INSTALLED_APPS وارد کنید، این کد رو بزنید:
@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
Star imports (also called wildcard imports), such as
@programming_tricks
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
@programming_tricks
خب در ادامهی تریکهای جنگو
حتما پیشاومده که دیده باشین یا خواسته باشین یه قسمتهایی از ویوی پنل ادمین برای یه مدل رو کولپس کنید، مثلا تعدادی فیلد که پشتسرهم هستن ولی پرکردنشون اجباری نیست. میخوام یه روش برای کولپس کردن این فیلدها بگم:
توی کلاس مدلادمین مدل موردنظر میاد و
@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/
https://www.20tab.com/en/blog/how-discover-which-variables-django-template/