<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های مجتبی کریمی</title><link>https://virgool.ir/feed/@thisiskarimi</link><description>گیک علاقه‌مند به یادگیری و گسترش دانش</description><language>fa</language><pubDate>2026-11-11 22:09:50</pubDate><image><url>https://files.virgool.ir/upload/users/80992/avatar/0ntWBp.png</url><title>مجتبی کریمی</title><link>https://virgool.ir/@thisiskarimi</link></image><item><title>باز کردن عکس با فرمت .heic در اوبونتو</title><link>https://virgool.ir/@thisiskarimi/open-heic-photos-in-ubuntu-txgylhzoa5bv</link><description>فرمت HEIC نام فرمت فایلی است که اپل برای استاندارد جدید HEIF (فرمت تصویر با کارایی بالا) انتخاب کرده است. با استفاده از روش‌های فشرده‌سازی پیشرفته و مدرن، این امکان را فراهم می‌کند که عکس‌ها در اندازه‌های فایل کوچک‌تر ایجاد شوند و در عین حال کیفیت تصویر بالاتری در مقایسه با JPEG/JPG حفظ شود.برای مشاهده این تصاویر HEIC در اوبونتو، این کار ها را انجام دهید...sudo apt update&#xA;sudo apt install heif-gdk-pixbuf&#xA;sudo apt install heif-thumbnailerحال به توضیح هر کدام از دستورات بالا میپردازیم:sudo apt install heif-gdk-pixbufاین دستور باعث میشود تا Image Viewer اصلی اوبونتو (Eye of GNOME, GNOME Image Viewer) بتواند از این فرمت فایل پشتیبانی کند. همچنین این دستور لایبرری libheif1 را نیز همراه خود نصب میکند.sudo apt install heif-thumbnailerنصب این پکیج به ما امکان میدهد تا thumbnail عکس ها را در فایل منیجر اوبونتو بتوانیم مشاهده کنیم.</description><category>مجتبی کریمی</category><author>مجتبی کریمی</author><pubDate>Fri, 09 Feb 2024 15:59:17 +0330</pubDate></item><item><title>آموزش ساخت List Action در محیط ادمین جنگو</title><link>https://virgool.ir/@thisiskarimi/how-to-create-django-admin-list-actions-slmzv45qofvm</link><description>هدف از ایجاد List Action در ادمین جنگو انجام عملیات روی آبجکت های یک مدل به صورت انبوه است. تمامی مدل ها در محیط ادمین جنگو با یک Action پیشفرض “حذف &lt;نام مدل&gt; انتخاب شده” همراه هستند. در این آموزش من شما را در مراحل ساخت List Action راهنمایی می کنم.ایجاد تابع Actionهر Action در لیست آبجکت ها یک تابع معمولی پایتون است که 3 پارامتر را به عنوان ورودی دریافت می کند:modeladmin فعلییک رکوئست (مثل توابعی که برای ویو می نویسیم)Queryset که یک لیست از آبجکت هایی است که می خواهیم تغییرات را بر روی آن ها اعمال کنیماین تابع های Action در داخل فایل admin.py  اپ جنگو ما قرار میگیرند ولی اگر واقعا در حال زیاد شدن بودند، میتوانید اونها را خارج از admin.py هم تعریف کنید.در ادامه نمونه کد پایه یک تابع Action را مشاهده می کنید:def my_admin_action(modeladmin, request, queryset):&#xA;        # do something with the queryset&#xA;my_admin_action.short_description = &#39;My admin action&#39;به عنوان یک نمونه ساده این مدل را در نظر بگیرید:models.pyfrom django.db import models&#xA;class Book(models.Model):&#xA;        HARDCOVER = 1&#xA;        PAPERBACK = 2&#xA;        EBOOK = 3&#xA;        BOOK_TYPES = (&#xA;                (HARDCOVER, &#39;Hardcover&#39;),&#xA;                (PAPERBACK, &#39;Paperback&#39;),&#xA;                (EBOOK, &#39;E-book&#39;),&#xA;        )&#xA;        title = models.CharField(max_length=50)&#xA;        publication_date = models.DateField(null=True)&#xA;        author = models.CharField(max_length=30, blank=True)&#xA;        price = models.DecimalField(max_digits=5, decimal_places=2)&#xA;        pages = models.IntegerField(blank=True, null=True)&#xA;        book_type = models.PositiveSmallIntegerField(choices=BOOK_TYPES)&#xA;        class Meta:&#xA;                verbose_name = &#39;book&#39;&#xA;                verbose_name_plural = &#39;books&#39;admin.pyfrom django.contrib import admin&#xA;from .models import Book&#xA;class BookAdmin(admin.ModelAdmin):&#xA;        list_display = [&#39;title&#39;, &#39;publication_date&#39;, &#39;author&#39;, &#39;price&#39;, &#39;book_type&#39;]&#xA;admin.site.register(Book, BookAdmin)حالا می خواهیم یک List Action بسازیم تا 10 درصد تخفیف روی کتاب های انتخاب شده اعمال کند. این کار به همین سادگی خواهد بود:admin.pyimport decimal&#xA;from django.contrib import admin&#xA;from .models import Book&#xA;def apply_discount(modeladmin, request, queryset):&#xA;        for book in queryset:&#xA;                book.price = book.price * decimal.Decimal(&#39;0.9&#39;)&#xA;                book.save()&#xA;apply_discount.short_description = &#39;Apply 10%% discount&#39;&#xA;class BookAdmin(admin.ModelAdmin):&#xA;        list_display = [&#39;title&#39;, &#39;publication_date&#39;, &#39;author&#39;, &#39;price&#39;, &#39;book_type&#39;]&#xA;        actions = [apply_discount, ]  # &lt;-- Add the list action function here&#xA;admin.site.register(Book, BookAdmin)فراموش نکنید که نام تابعی را که ساختید، در لیست actions اضافه کنید. نتیجه چنین چیزی خواهد بود:نکته: شما می توانید تابع apply_discount را با استفاده از اصطلاح ()F در جنگو بهینه تر کنید:from django.db.models import F&#xA;def apply_discount(modeladmin, request, queryset):&#xA;        queryset.update(price=F(&#39;price&#39;) * decimal.Decimal(&#39;0.9&#39;))نمونه خروجی CSVهمچنین شما می توانید از List Action استفاده کنید تا به شما یک HttpResponse برگشت دهد. یک نمونه ساده خروجی به CSV:admin.pyimport decimal, csv&#xA;from django.contrib import admin&#xA;from django.http import HttpResponse&#xA;from django.db.models import F&#xA;from .models import Book&#xA;def apply_discount(modeladmin, request, queryset):&#xA;        queryset.update(price=F(&#39;price&#39;) * decimal.Decimal(&#39;0.9&#39;))&#xA;apply_discount.short_description = &#39;Apply 10%% discount&#39;&#xA;def export_books(modeladmin, request, queryset):&#xA;        response = HttpResponse(content_type=&#39;text/csv&#39;)&#xA;        response[&#39;Content-Disposition&#39;] = &#39;attachment; filename=&#34;books.csv&#34;&#39;&#xA;        writer = csv.writer(response)&#xA;        writer.writerow([&#39;Title&#39;, &#39;Publication Date&#39;, &#39;Author&#39;, &#39;Price&#39;, &#39;Pages&#39;, &#39;Book Type&#39;])&#xA;        books = queryset.values_list(&#39;title&#39;, &#39;publication_date&#39;, &#39;author&#39;, &#39;price&#39;, &#39;pages&#39;, &#39;book_type&#39;)&#xA;        for book in books:&#xA;                writer.writerow(book)&#xA;        return response&#xA;export_books.short_description = &#39;Export to csv&#39;&#xA;class BookAdmin(admin.ModelAdmin):&#xA;        list_display = [&#39;title&#39;, &#39;publication_date&#39;, &#39;author&#39;, &#39;price&#39;, &#39;book_type&#39;]&#xA;        actions = [apply_discount, export_books, ]&#xA;admin.site.register(Book, BookAdmin)List Action به عنوان تابع کلاس Model Adminیک روش جایگزین برای انجام این کار،  ایجاد تابع List Action به عنوان یک متد از کلاس ادمین است:class BookAdmin(admin.ModelAdmin):&#xA;        list_display = [&#39;title&#39;, &#39;publication_date&#39;, &#39;author&#39;, &#39;price&#39;, &#39;book_type&#39;]&#xA;actions = [&#39;apply_discount&#39;, export_books]&#xA;def apply_discount(self, request, queryset):&#xA;        queryset.update(price=F(&#39;price&#39;) * decimal.Decimal(&#39;0.9&#39;))&#xA;apply_discount.short_description = &#39;Apply 10%% discount&#39;نام متدی را که ساختید، در قالب یک رشته به لیست actions ارسال کنید و اولین آرگومان (کلمه کلیدی modeladmin) را به self تغییر نام دهید.امیدوارم از این آموزش بهره ببرید!منبع: simpleisbetterthancomplex</description><category>مجتبی کریمی</category><author>مجتبی کریمی</author><pubDate>Sat, 28 Mar 2020 18:28:58 +0430</pubDate></item><item><title>تنظیم اتوماتیک فیلد تاریخ و ساعت در مدل های جنگو</title><link>https://virgool.ir/@thisiskarimi/تنظیم-اتوماتیک-فیلد-تاریخ-و-ساعت-در-مدل-های-جنگو-ozlgslzhsfx4</link><description>هر دو تا فیلد DateTimeField و DateField در مدل های جنگو بسیار برای مدیریت زمان و تاریخ کاربردی هستند.شما اگه بخواید یه آمار داشته باشید تا بدونید یک نمونه از مدلتون(همون آبجکت) کی و چه زمانی ساخته شده و یا آپدیت شده(دستکاری شده)، نیازی ندارید که این کارو دستی انجام بدید. فقط کافیه تو این فیلد ها آرگومان های auto_now و auto_now_add رو برابر با True تنظیک کنید. مثال زیر رو ببینید:class Post(models.Model): &#xA;    description = models.CharField(max_length=255)&#xA;    created_at = models.DateTimeField(auto_now_add=True)&#xA;    updated_at = models.DateTimeField(auto_now=True)`آرگومان auto_now_add، از ()timezone.now فقط وقتی که یک آبجکت ساخته میشود برای تنظیم زمان استفاده میکند و auto_now فقط زمانی که متود ذخیره یک آبجکت فراخوانی میشه وارد عمل میشه و زمان رو برامون آپدیت میکنه.</description><category>مجتبی کریمی</category><author>مجتبی کریمی</author><pubDate>Mon, 24 Feb 2020 11:13:09 +0330</pubDate></item><item><title>نشان دادن سه رقم سه رقم اعداد در فریمورک جنگو</title><link>https://virgool.ir/@thisiskarimi/نشان-دادن-سه-رقم-سه-رقم-اعداد-در-فریمورک-جنگو-icupxpx9am4t</link><description>لوگو فریمورک جنگوبعد از مدتی که با جنگو آشنا شدم و پروژه هامو باهاش ران میکردم فهمیدم خیلی از میانبرها یا به قول خودمون ترفندای جنگو به زبان فارسی آموزش داده نشده و پیدا کردنشون تو محیط وبسایت های انگلیسی زبان گاهی زمانبر و گیج کننده میتونه باشه.یکی از اون میانبرها نحوه ی نشان دادن سه رقم سه رقم اعداد هستش که مثلا تو نشون دادن قیمت به کار میاد.اول مطمئن بشید که در settings.py پروژه و در قسمت INSTALLED_APPS این عبارت رو به بقیه خط هایی که از قبل هستش اضافه کنید: &#39;django.contrib.humanize&#39; یه چیزی شبیه این:INSTALLED_APPS = [&#xA;     &#39;django.contrib.admin&#39;,&#xA;     &#39;django.contrib.auth&#39;,&#xA;     &#39;django.contrib.contenttypes&#39;,&#xA;     &#39;django.contrib.sessions&#39;,&#xA;     &#39;django.contrib.messages&#39;,&#xA;     &#39;django.contrib.staticfiles&#39;,&#xA;     &#39;django.contrib.humanize&#39;,&#xA;     ]حالا کافیه داخل template های مد نظرتون ابتدا در خطوط ابتدایی با عبارت{% load humanize %} استفاده از این ویژگی را فعال کنید و تمام! حالا هر جایی که دوست داشتید داخل template تون جلوی عدد کافیه intcomma| بذارید. حواستون به علامت | قبل از لغت intcomma باشه شاید نبینیدش!!!{{543210|intcomma}}&#xA;خروجی: 543,210اگر این ابزار کار نکرد و اعداد به همون شکل قبلی نمایش داده شدن احتمالا تو setting.py پروژه تون LANGUAGE_CODE = &#39;fa&#39;تعریف شده که برای حل این مشکل کافیه یه دونقطهFalse جلوی intcomma بذارید که میشه اینطوری:{{543210|intcomma:False}}از اینجا به بعد یه توضیح تکمیلی در مورد اینکه چرا دونقطهFalse بهش اضافه کردیم میدم که خب شاید به دردتون نخوره ولی دونستنش میتونه اطلاعاتتونو بالاتر ببره :)این ابزار یه خوبی دیگه داره: اینکه با فرهنگ هر کشور خودشو تطبیق میده مثلا اگه تو settings.py پروژه و در قسمتLANGUAGE_CODE = &#39;de&#39;تعریف شده باشه، متوجه میشه که باید طبق زبان آلمانی سه رقم رو از هم جدا کنه و به جای ویرگول بین رقم ها از نقطه استفاده میکنه، اینطوری45000 میشه45.000چون آلمانیا به جای ویرگول از نقطه استفاده میکنن. حالا اگه به فارسی تنظیم شده باشه جنگو براش تعریف نشده که اعداد زبان فارسی رو چجوری رقم هاشو جدا کنه پس کاری روش انجام نشده. ما دو نقطهFalse رو در این شرایط بهش اضافه میکنیم که بهش بفهمونیم نمیخواد مطابق ربان ما اینکارو بکنه و همون به طور پیشفرض (طبق ربان انگلیسی) کارشو انجام بده؛ تمام!حالا رو پروژه تون امتحان کنید و هر جایی نیاز به توضیح بیشتر داشتید خوشحال میشم باهام در ارتباط باشید :)</description><category>مجتبی کریمی</category><author>مجتبی کریمی</author><pubDate>Sat, 19 Oct 2019 20:55:20 +0330</pubDate></item></channel></rss>