<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Syeda Maham Fahim</title>
    <description>The latest articles on Forem by Syeda Maham Fahim (@syedamahamfahim).</description>
    <link>https://forem.com/syedamahamfahim</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2505860%2F7e24058f-8250-4d76-af4c-103a9ec56fc2.jpg</url>
      <title>Forem: Syeda Maham Fahim</title>
      <link>https://forem.com/syedamahamfahim</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/syedamahamfahim"/>
    <language>en</language>
    <item>
      <title>How to Import/Export CSV file in pgAdmin</title>
      <dc:creator>Syeda Maham Fahim</dc:creator>
      <pubDate>Thu, 13 Feb 2025 10:13:23 +0000</pubDate>
      <link>https://forem.com/syedamahamfahim/how-to-importexport-csv-file-in-pgadmin-2b6i</link>
      <guid>https://forem.com/syedamahamfahim/how-to-importexport-csv-file-in-pgadmin-2b6i</guid>
      <description>&lt;p&gt;Working with databases often involves handling large amounts of data. One of the most common ways to import or export data is through CSV files. &lt;/p&gt;

&lt;p&gt;This article covers simple steps for importing and exporting CSV files using pgAdmin.&lt;/p&gt;

&lt;p&gt;Let’s get started!&lt;/p&gt;

&lt;h3&gt;
  
  
  Importing CSV into pgAdmin
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Right-click on the table&lt;/strong&gt; where you want to import the CSV file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A popup will appear.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy7pgap2nkjij6iok121.png" alt="Table Right Click" width="800" height="518"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Click on the folder icon&lt;/strong&gt; (highlighted in the green square).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new popup will open.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0dar307n7cnlm5h10vw.png" alt="popup" width="800" height="454"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Click on the three horizontal dots&lt;/strong&gt; on the right side of the popup.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A dropdown menu will appear with the “Upload” option.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1cn5onp67p0vgnwsz3br.png" alt="Upload option" width="800" height="453"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Upload the file&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After selecting the "Upload" option, a new popup will appear where you can choose your file.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kb6bdo02bvt8k4q91yl.png" alt="upload popup" width="800" height="455"&gt;
&lt;/li&gt;
&lt;li&gt;Note: The maximum file size is 50MB, so make sure your file doesn't exceed this limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Close the popup&lt;/strong&gt; by clicking on the first 'X' button. Don’t click the second one as it will remove the file from the list.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fete41q8cuz8z6txhdmpz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fete41q8cuz8z6txhdmpz.png" alt="close button" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select the file&lt;/strong&gt; you just uploaded.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjxpu8g8sk7oo37ag7k9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjxpu8g8sk7oo37ag7k9.png" alt="selection" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ensure the CSV Columns Match the Database&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure the columns in your CSV match those in your database table. &lt;/li&gt;
&lt;li&gt;In the screenshot below, the database columns are &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;published_date&lt;/code&gt;, &lt;code&gt;city&lt;/code&gt;, etc.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F20u0xv24zq07hikpqt2i.png" alt="database columns" width="800" height="375"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSV Columns&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Similarly, ensure that your CSV file has the same columns in the same positions as the database.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzkqiufvoukeewmldzvlr.png" alt="csv" width="800" height="417"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Note&lt;/strong&gt;: The &lt;code&gt;id&lt;/code&gt; column is not included in the CSV because PostgreSQL will generate this automatically. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Excluding Unwanted Columns
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exclude unwanted columns&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the "Columns" tab, remove the columns that you don’t want to import (e.g., &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;created_at&lt;/code&gt;, &lt;code&gt;updated_at&lt;/code&gt;).
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2jjtfya3mu7oueaja0cb.png" alt="exclude_columns" width="800" height="525"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Click OK&lt;/strong&gt; to complete the import process. Your CSV file will be successfully imported into pgAdmin.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Exporting CSV from pgAdmin
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Go to the Export tab&lt;/strong&gt; and click the folder icon to choose the file location where you want to export your data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the 'Export' button to start the process. Once completed, a &lt;strong&gt;success message&lt;/strong&gt; will appear&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1fsaaarscv7e9aloymi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1fsaaarscv7e9aloymi.png" alt="success message" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Accessing the Exported CSV
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Where to find your exported CSV file?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t worry! You can easily find your exported file by clicking on the &lt;strong&gt;Tools&lt;/strong&gt; option in the header, followed by &lt;strong&gt;Storage Manager&lt;/strong&gt;.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8k9mw08gxcmup28pnas.png" alt="Storage Manager" width="531" height="602"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A new popup will show all your stored files.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypq4jsgrwpfkrh9pchqj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypq4jsgrwpfkrh9pchqj.png" alt="all_files" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the file and &lt;strong&gt;click on the download button&lt;/strong&gt; to get your exported CSV file.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;And there you have it! &lt;/p&gt;

&lt;p&gt;You've learned how to import and export CSV files in pgAdmin easily. &lt;/p&gt;

&lt;p&gt;This process is quite simple once you get the hang of it, and it's a great way to manage your data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Stay Connected - &lt;a class="mentioned-user" href="https://dev.to/syedamahamfahim"&gt;@syedamahamfahim&lt;/a&gt; 🐬&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>pgadmin</category>
      <category>postgres</category>
      <category>sql</category>
      <category>csv</category>
    </item>
    <item>
      <title>How to Generate and Use SSH Keys In Windows</title>
      <dc:creator>Syeda Maham Fahim</dc:creator>
      <pubDate>Mon, 27 Jan 2025 20:58:47 +0000</pubDate>
      <link>https://forem.com/syedamahamfahim/how-to-generate-and-use-ssh-keys-in-windows-58g4</link>
      <guid>https://forem.com/syedamahamfahim/how-to-generate-and-use-ssh-keys-in-windows-58g4</guid>
      <description>&lt;p&gt;When working with remote servers, SSH keys are a secure and convenient way to authenticate without repeatedly entering passwords. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;PuTTY&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;PuTTY is one of the most popular tools to generate SSH keys on Windows and connect to servers like AWS or DigitalOcean.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll walk you through the steps to install PuTTY, create SSH keys, and set up secure connections with servers. Let’s get started!&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;1. Installing PuTTY&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Download PuTTY from its &lt;a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html" rel="noopener noreferrer"&gt;official website&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;Choose the version that matches your system's configuration (32-bit or 64-bit).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5v4079cul44dh7skyahy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5v4079cul44dh7skyahy.png" alt="PuTTY" width="800" height="370"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Once downloaded, install PuTTY by following the on-screen instructions.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Open PuTTY&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;After installation, search for &lt;strong&gt;PuTTY&lt;/strong&gt; in your system's search bar and open it.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqb0gzdbyszu81uibckyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqb0gzdbyszu81uibckyo.png" alt="Searchbar" width="800" height="680"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;This will open the main PuTTY screen where you can generate SSH keys.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Generate an SSH Key&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open &lt;strong&gt;PuTTYgen&lt;/strong&gt;, a key generator tool included with PuTTY. You’ll see the following screen:
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuxefv28j0gm5sb6y9wx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuxefv28j0gm5sb6y9wx.png" alt="window popup" width="629" height="502"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on &lt;strong&gt;Generate&lt;/strong&gt; to start creating your SSH key.
&lt;/li&gt;
&lt;li&gt;You will be asked to move your mouse randomly over the blank space in the PuTTYgen window to generate randomness (entropy) for a secure key.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibw24evi85gf72ywv4r2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibw24evi85gf72ywv4r2.png" alt="generate" width="648" height="506"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;After the process is complete, you’ll see your SSH key displayed in the window:  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8m6ja0vmhhxxotqp3mcx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8m6ja0vmhhxxotqp3mcx.png" alt="SSH key" width="661" height="514"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. Save Your SSH Keys&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy the public SSH key&lt;/strong&gt; displayed in the box. This key will be pasted into the server's SSH settings.
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save private key&lt;/strong&gt; to store the private key securely on your computer.
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; The private key is critical because it can regenerate the public key whenever needed. Make sure to save it in a secure location!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. Regenerate Public Key from Private Key&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you ever lose your public key, don’t worry! You can easily regenerate it from your saved private key.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;PuTTYgen&lt;/strong&gt; again.
&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Load&lt;/strong&gt; and select your saved private key file.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk4jdcn1c2v1cs0vt287z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk4jdcn1c2v1cs0vt287z.png" alt="Generating public key from private key" width="800" height="479"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Your public key will be displayed again, ready to use.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;6. Connect to a Server Using Your SSH Key&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now that your SSH keys are ready, you can use them to connect to remote servers. Simply:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy the &lt;strong&gt;public key&lt;/strong&gt; to your server's SSH settings (e.g., AWS or DigitalOcean).
&lt;/li&gt;
&lt;li&gt;Use the private key when logging in through PuTTY to authenticate securely.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setting up SSH keys on Windows using PuTTY is straightforward and ensures secure connections to remote servers. Remember these key points:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Save your private key securely.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Use your public key to set up server authentication.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;Stay Connected - &lt;a class="mentioned-user" href="https://dev.to/syedamahamfahim"&gt;@syedamahamfahim&lt;/a&gt; 🐬&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>ssh</category>
      <category>cli</category>
      <category>microsoft</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to create a custom filter in Django Admin/CMS</title>
      <dc:creator>Syeda Maham Fahim</dc:creator>
      <pubDate>Mon, 27 Jan 2025 13:59:22 +0000</pubDate>
      <link>https://forem.com/syedamahamfahim/how-to-create-a-custom-filter-in-django-admincms-35kl</link>
      <guid>https://forem.com/syedamahamfahim/how-to-create-a-custom-filter-in-django-admincms-35kl</guid>
      <description>&lt;p&gt;It is literally amazing that Django provides so many built-in filters. Imagine how much time the Django admin panel saves us. Moreover, its filtration functionality is outstanding. &lt;/p&gt;

&lt;p&gt;For example, you only have to define the list_filter in your admin class and boom – you get fully functional filters like this: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqtt3t62nnlral35032o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqtt3t62nnlral35032o.png" alt="admin.py" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Just focus on list_filter&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But what if you want to add custom filters based on specific criteria? Does Django provide a way to do this?&lt;/p&gt;

&lt;p&gt;Well, as our programming partner, &lt;strong&gt;YES. YES. YES&lt;/strong&gt;, Django does allow us to create custom filters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Use Case
&lt;/h3&gt;

&lt;p&gt;Suppose you have a model like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn02gwv8qtgoq2f9ptkks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn02gwv8qtgoq2f9ptkks.png" alt="model.py" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you want to create filters based on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Room Range&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 room, 2 rooms, 3 rooms, 4 or more rooms.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Building Age&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under Construction, Less than a year, 1 to 2 years, 3 to 4 years, 5 to 10 years, '11 to 15 years, 16 to 20 years, 21 to 25 years', 26 to 30 years, 30 years or more.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most importantly, this involves specific ranges. The database stores these values as strings, but filtration needs to handle them as integers or floats.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a New File: &lt;code&gt;filter_utils.py&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;To create a custom filter, Django provides the tools through &lt;code&gt;django.contrib&lt;/code&gt;. Start by importing &lt;code&gt;admin&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7p6np49xok2fkyxi29p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7p6np49xok2fkyxi29p.png" alt="django.contrib" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you Ctrl + Click on the admin keyword, you will land in the admin module. Here, you’ll notice various types of filters Django offers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsj58kp545ubqx74al0b4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsj58kp545ubqx74al0b4.png" alt="Django filter" width="800" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just focus on the filters section:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo42yr0bw5xwzx2au32p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo42yr0bw5xwzx2au32p.png" alt=".filters" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, I am gonna use SimpleListFilter so, if you again Ctrl + Click to explore this class on it you will get into the &lt;code&gt;SimpleListFilter&lt;/code&gt; class and &lt;code&gt;ListFilter&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmuj9qwgyf5jbvlrbancj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmuj9qwgyf5jbvlrbancj.png" alt="SimpleListFilter " width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, If you explore these classes, you’ll find these methods and attributes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Methods&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;has_output&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;choices&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;queryset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;expected_parameters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;value&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Attributes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;used_parameters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parameter_name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lookup_choices&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;we can use them in creating filters. I am not gonna cover all of them since I don't need all but if you wanna learn about them check this official documentation &lt;br&gt;
&lt;a href="https://docs.djangoproject.com/en/5.1/ref/contrib/admin/filters/" rel="noopener noreferrer"&gt;https://docs.djangoproject.com/en/5.1/ref/contrib/admin/filters/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's do this &lt;/p&gt;

&lt;h3&gt;
  
  
  Room Range Filter
&lt;/h3&gt;

&lt;p&gt;This is my RoomRangeFilter&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24i0d11h2x3s6c909kml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24i0d11h2x3s6c909kml.png" alt="RoomRangeFilter" width="800" height="875"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, &lt;br&gt;
&lt;strong&gt;title&lt;/strong&gt;: This method returns a list of tuples where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first element is the coded value for the URL query.&lt;/li&gt;
&lt;li&gt;The second element is the human-readable name for the filter option.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqj9xab3pjrlc58yqdwxv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqj9xab3pjrlc58yqdwxv.png" alt="title" width="668" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;lookups&lt;/strong&gt;: Returns a list of tuples. The first element in each tuple is the coded value for the option that will appear in the URL query. The second element is the human-readable name for the option that will appear in the right sidebar&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rffmr8pxar64gmo5neh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rffmr8pxar64gmo5neh.png" alt="lookups" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;queryset&lt;/strong&gt;: Returns the filtered queryset based on the value provided in the query string and retrievable via`self.value()&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfkwabssmekn02aw0zia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfkwabssmekn02aw0zia.png" alt="queryset" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When applied, this filter will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcz57ob1y1agt8ugiw6u6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcz57ob1y1agt8ugiw6u6.png" alt="Range Filter Title" width="729" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Building Age Filter
&lt;/h3&gt;

&lt;p&gt;Another example is a &lt;code&gt;BuildingAgeFilter&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4rs6sm0womrdbqt89m8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4rs6sm0womrdbqt89m8.png" alt="BuildingAgeFilter" width="800" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But here is a tricky part &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exclude empty and null values in your filter logic when needed.&lt;/li&gt;
&lt;li&gt;Handle data type conversions (e.g., casting strings to integers) to ensure the filter works correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They all come from query set (self, request, queryset) function parameters. &lt;/p&gt;

&lt;p&gt;If you wanna learn more about this check the official Django documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Folder Structure
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3u7lvinq617lceuxoa0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3u7lvinq617lceuxoa0l.png" alt="Folder Structure" width="394" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Django’s admin panel makes filtering super easy, but custom filters give you extra flexibility. Using SimpleListFilter, you can create filters that fit your needs perfectly. Just override methods like queryset and lookups, and you’re good to go.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Stay Connected - &lt;a class="mentioned-user" href="https://dev.to/syedamahamfahim"&gt;@syedamahamfahim&lt;/a&gt; 🐬&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Create Custom Template Tags in Django?</title>
      <dc:creator>Syeda Maham Fahim</dc:creator>
      <pubDate>Sun, 26 Jan 2025 22:24:58 +0000</pubDate>
      <link>https://forem.com/syedamahamfahim/how-to-create-custom-template-tags-in-django-4knd</link>
      <guid>https://forem.com/syedamahamfahim/how-to-create-custom-template-tags-in-django-4knd</guid>
      <description>&lt;p&gt;If you have worked with Django, you must have used templates. Templates in Django are simply HTML files that can receive data from the views and display it on the website.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Example of Django Template
&lt;/h3&gt;

&lt;p&gt;Imagine you have an HTML template like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipyimvyfczm7tqra2jce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipyimvyfczm7tqra2jce.png" alt="Django Template" width="800" height="715"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This template will get data from the view, like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3ckqyod6xss9hor03r5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3ckqyod6xss9hor03r5.png" alt="View.py" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the example above, we have a template called &lt;code&gt;courses&lt;/code&gt; where the data (like course names) is being passed from the &lt;code&gt;views.py&lt;/code&gt; file. The output on the website will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flheilw7bc4zjsskuazzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flheilw7bc4zjsskuazzd.png" alt="Website" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem: Displaying Course Count
&lt;/h3&gt;

&lt;p&gt;Now, let’s say you want to show the &lt;strong&gt;total number of courses&lt;/strong&gt; on the website. You may think of adding the logic to the view, and that’s correct. You would do something like this in your &lt;code&gt;views.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;course_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;total_courses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;courses.html&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;courses&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;courses&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total_courses&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;total_courses&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But what if you have multiple pages on your website, like a &lt;strong&gt;blog page&lt;/strong&gt;, &lt;strong&gt;author page&lt;/strong&gt;, &lt;strong&gt;instructor page&lt;/strong&gt;, and you want to display the course count on all of them? &lt;/p&gt;

&lt;p&gt;You would need to add the logic in each of the views, and that can get messy. This is where &lt;strong&gt;template tags&lt;/strong&gt; come in.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a Template Tag?
&lt;/h3&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;template tag&lt;/strong&gt; in Django is a special kind of tag that allows you to add custom functionality within Django’s template system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Template tags make it easier to reuse logic across different templates, without having to repeat the same code in your views.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Use Template Tags?
&lt;/h3&gt;

&lt;p&gt;Let’s say you have a courses app where you want to display:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total number of courses&lt;/li&gt;
&lt;li&gt;Number of available courses&lt;/li&gt;
&lt;li&gt;Number of enrolled students&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of adding this logic in each view, you can use &lt;strong&gt;template tags&lt;/strong&gt; to make it easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create a Template Tag
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create the &lt;code&gt;templatetags&lt;/code&gt; folder&lt;/strong&gt; inside your &lt;code&gt;courses&lt;/code&gt; app:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your folder structure will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   courses/
       ├── templatetags/
           ├── __init__.py
           └── course_tags.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Inside the &lt;code&gt;course_tags.py&lt;/code&gt; file, define a &lt;strong&gt;template tag&lt;/strong&gt; that will calculate and return the total number of courses, number of available courses, and number of enrolled students.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;
   &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;courses.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Course&lt;/span&gt;

   &lt;span class="n"&gt;register&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Library&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

   &lt;span class="nd"&gt;@register.simple_tag&lt;/span&gt;
   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;total_courses&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

   &lt;span class="nd"&gt;@register.simple_tag&lt;/span&gt;
   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;available_courses&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_available&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

   &lt;span class="nd"&gt;@register.simple_tag&lt;/span&gt;
   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;enrolled_students&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;course_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
       &lt;span class="n"&gt;course&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;course_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enrolled_students&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Load and Use the Template Tags in Your Templates
&lt;/h3&gt;

&lt;p&gt;Now, you can use these template tags in your HTML templates to display relevant data on different pages related to courses.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example 1: Displaying Course Count on the Course List Page
&lt;/h4&gt;

&lt;p&gt;In your &lt;code&gt;course_list.html&lt;/code&gt; template, you can load the custom tags and use them to display the total number of courses and available courses.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;{% load course_tags %}

&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Course List&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;All Courses&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Total courses: {% total_courses %}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Available courses: {% available_courses %}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
        {% for course in courses %}
            &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;{{ course.name }} - {{ course.description }}&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        {% endfor %}
    &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This template will show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The total number of courses.&lt;/li&gt;
&lt;li&gt;The number of available courses.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example 2: Displaying Enrolled Students on a Course Detail Page
&lt;/h4&gt;

&lt;p&gt;For the course details page, you can use the &lt;code&gt;enrolled_students&lt;/code&gt; template tag to show how many students are enrolled in a specific course.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;{% load course_tags %}

&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;{{ course.name }}&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;{{ course.name }}&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ course.description }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Enrolled students: {% enrolled_students course.id %}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Enroll Now&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Add enrollment form here --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the &lt;code&gt;enrolled_students&lt;/code&gt; tag takes the &lt;code&gt;course.id&lt;/code&gt; and returns the number of students enrolled in that specific course.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of Using Template Tags in This Example
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Once you define a template tag (like &lt;code&gt;total_courses&lt;/code&gt;, &lt;code&gt;available_courses&lt;/code&gt;, or &lt;code&gt;enrolled_students&lt;/code&gt;), you can use it in multiple places across your app without repeating the same logic in each view.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you want to change how the course count is calculated (e.g., if you add a new filter for "active" courses), you only need to update the tag, not every view or template.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Final Output
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpe8eqe8ea4un2d244qbk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpe8eqe8ea4un2d244qbk.png" alt="Final Output" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In this blog post, we used &lt;strong&gt;template tags&lt;/strong&gt; in Django to avoid adding repetitive logic for counting courses and students in each view. Instead of manually passing the data from views, we created reusable template tags that can be used across multiple templates in the courses app.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;Stay Connected - &lt;a class="mentioned-user" href="https://dev.to/syedamahamfahim"&gt;@syedamahamfahim&lt;/a&gt; 🐬&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to disable admin editing in the Django Admin Panel</title>
      <dc:creator>Syeda Maham Fahim</dc:creator>
      <pubDate>Sun, 26 Jan 2025 20:09:59 +0000</pubDate>
      <link>https://forem.com/syedamahamfahim/how-to-disable-admin-editing-in-django-admin-panel-33g9</link>
      <guid>https://forem.com/syedamahamfahim/how-to-disable-admin-editing-in-django-admin-panel-33g9</guid>
      <description>&lt;p&gt;Not gonna lie, the Django Admin Panel is super helpful for managing models, data, and users directly from a user-friendly interface. You don’t have to create advanced search and filtration features from scratch—it’s already built-in!  &lt;/p&gt;

&lt;p&gt;But what if you want to restrict editing for certain models or fields?  &lt;/p&gt;

&lt;p&gt;Sometimes, allowing editing in the Admin Panel isn’t the best idea, especially when:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The data needs to remain consistent and shouldn’t be modified accidentally.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You only want to display data without adding or editing it.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Real-Life Scenario
&lt;/h3&gt;

&lt;p&gt;Recently, one of my clients needed a way to view data with filtration and pagination. The data was scraped from another website, and the client wanted an easy way to track new property listings.  &lt;/p&gt;

&lt;p&gt;For this, I decided to use Django. It gave me a simple way to manage and display the data without the hassle of creating custom pages.  &lt;/p&gt;

&lt;p&gt;Take a look at the screenshots:  &lt;/p&gt;

&lt;h4&gt;
  
  
  Admin Panel Overview:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7bl4rmxa2kro9dwzl7b0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7bl4rmxa2kro9dwzl7b0.png" alt="Admin Panel Overview" width="800" height="430"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Here, the admin panel only shows &lt;strong&gt;Import/Export options&lt;/strong&gt;. There’s no way to add or edit data from the admin panel.  &lt;/p&gt;
&lt;h4&gt;
  
  
  Individual Page:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy90ub36nhwnzt2norsdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy90ub36nhwnzt2norsdg.png" alt="Individual Page" width="800" height="394"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
The individual entry pages also don’t have any edit options.  &lt;/p&gt;

&lt;p&gt;Now, let me show you how to set this up in Django.  &lt;/p&gt;


&lt;h3&gt;
  
  
  Steps to Disable Editing
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. &lt;strong&gt;Define Your Model&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Here’s an example of the model I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IntegerField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;date_listed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This model is used to store property data scraped from the external website.  &lt;/p&gt;




&lt;h4&gt;
  
  
  2. &lt;strong&gt;Customize the Admin Panel&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;To disable editing, simply override two functions in your &lt;code&gt;admin.py&lt;/code&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;has_add_permission&lt;/code&gt;: Disables adding new entries.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;has_change_permission&lt;/code&gt;: Disables editing existing entries.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s how the &lt;code&gt;admin.py&lt;/code&gt; looks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.contrib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Property&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReadOnlyAdmin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelAdmin&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;list_display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;date_listed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Fields to display
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;has_add_permission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;  &lt;span class="c1"&gt;# Disable adding new entries
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;has_change_permission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;  &lt;span class="c1"&gt;# Disable editing existing entries
&lt;/span&gt;
&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Property&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ReadOnlyAdmin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’ve also used a base class here to manage &lt;code&gt;list_display&lt;/code&gt; for better data presentation.  &lt;/p&gt;




&lt;h3&gt;
  
  
  What Does This Do?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No Add Option&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The “Add” button is removed from the admin panel.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No Edit Option&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When you click on an entry, it opens in &lt;strong&gt;read-only mode&lt;/strong&gt;, without any save buttons.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This setup is perfect for situations where:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You only want to display data.
&lt;/li&gt;
&lt;li&gt;Editing and adding entries isn’t necessary or could cause issues.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Why Is This Useful?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Preserve Data Integrity:&lt;/strong&gt;
If the data comes from an external source (like scraping or APIs), it’s better to avoid manual editing in the admin panel to ensure consistency.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-&lt;strong&gt;Read-Only Views for Reference Data:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sometimes, the admin panel is just used for viewing or filtering data. For example, analytics dashboards, property listings, or logs.  &lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Disabling editing in Django Admin is super easy and incredibly useful when you need to protect or display data without allowing accidental changes.  &lt;/p&gt;

&lt;p&gt;Follow the steps above, and you’ll have a secure, read-only admin panel ready in no time.  &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;Stay Connected - &lt;a class="mentioned-user" href="https://dev.to/syedamahamfahim"&gt;@syedamahamfahim&lt;/a&gt; 🐬&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>django</category>
      <category>python</category>
    </item>
    <item>
      <title>How to Reset PostgreSQL Password</title>
      <dc:creator>Syeda Maham Fahim</dc:creator>
      <pubDate>Fri, 24 Jan 2025 22:19:11 +0000</pubDate>
      <link>https://forem.com/syedamahamfahim/how-to-reset-postgresql-password-bb1</link>
      <guid>https://forem.com/syedamahamfahim/how-to-reset-postgresql-password-bb1</guid>
      <description>&lt;p&gt;I'm writing this article because I recently ran into an issue with PostgreSQL where I had to reset the password. The steps are simple, but if you’re new to PostgreSQL or running it on Windows, it might get tricky. So, let’s break it down into clear steps that are easy to follow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Stop the PostgreSQL Service
&lt;/h3&gt;

&lt;p&gt;First, we need to stop the PostgreSQL service before we can reset the password. Here’s how you do that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Press &lt;strong&gt;Win + R&lt;/strong&gt;, type &lt;strong&gt;services.msc&lt;/strong&gt;, and hit &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2n3xg3fzvom64fz9n1s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2n3xg3fzvom64fz9n1s.png" alt="Win + R" width="394" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look for &lt;strong&gt;PostgreSQL&lt;/strong&gt; in the list.&lt;/li&gt;
&lt;li&gt;Right-click on it and choose &lt;strong&gt;Stop&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F115fz2c2h62lugxbja4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F115fz2c2h62lugxbja4h.png" alt="postres" width="655" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Start PostgreSQL in Single-User Mode
&lt;/h3&gt;

&lt;p&gt;Now, we’ll start PostgreSQL in &lt;strong&gt;single-user mode&lt;/strong&gt;. This mode allows us to reset the password without needing the current one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open &lt;strong&gt;Command Prompt&lt;/strong&gt; as an administrator.&lt;br&gt;&lt;br&gt;
To do this, press &lt;strong&gt;Win + S&lt;/strong&gt;, type &lt;strong&gt;cmd&lt;/strong&gt;, right-click on &lt;strong&gt;Command Prompt&lt;/strong&gt;, and choose &lt;strong&gt;Run as administrator&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now, navigate to the PostgreSQL &lt;strong&gt;bin&lt;/strong&gt; directory where the executable is located. Typically, it’s in:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;ostgreSQL&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="s2"&gt;6&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;After that, run PostgreSQL in &lt;strong&gt;single-user mode&lt;/strong&gt; with this command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  postgres &lt;span class="nt"&gt;--single&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;ostgreSQL&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="s2"&gt;6&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s2"&gt;ata"&lt;/span&gt; postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Replace &lt;code&gt;"C:\Program Files\PostgreSQL\16\data"&lt;/code&gt; with your actual data directory path if it’s different.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Reset the Password
&lt;/h3&gt;

&lt;p&gt;Once PostgreSQL starts in single-user mode, you’ll see a prompt where you can run SQL commands. To reset the password for the &lt;strong&gt;postgres&lt;/strong&gt; user, use this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="n"&gt;postgres&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;PASSWORD&lt;/span&gt; &lt;span class="s1"&gt;'your_new_password'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;'your_new_password'&lt;/code&gt; with the new password you want to set.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After entering the command, press &lt;strong&gt;Enter&lt;/strong&gt; to reset the password.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Restart the PostgreSQL Service
&lt;/h3&gt;

&lt;p&gt;After resetting the password, exit the single-user mode by closing the Command Prompt window. Then, go back to the &lt;strong&gt;Services&lt;/strong&gt; tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Right-click on &lt;strong&gt;PostgreSQL&lt;/strong&gt; and choose &lt;strong&gt;Start&lt;/strong&gt; to restart the service.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 5: Reconnect with pgAdmin
&lt;/h3&gt;

&lt;p&gt;Finally, open &lt;strong&gt;pgAdmin 4&lt;/strong&gt; (or any other PostgreSQL client you use) and try connecting with the new password. &lt;/p&gt;

&lt;p&gt;If it still doesn’t work, you may need to update the saved password:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Right-click on the server in the &lt;strong&gt;Object Browser&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Properties&lt;/strong&gt; → &lt;strong&gt;Connection&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter the new password and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Simplified Process (For Quick Reference)
&lt;/h3&gt;

&lt;p&gt;In simpler terms, here’s what you need to do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stop PostgreSQL&lt;/strong&gt;: Go to &lt;strong&gt;services.msc&lt;/strong&gt; and stop PostgreSQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Command Prompt as Admin&lt;/strong&gt;: Search for &lt;strong&gt;cmd&lt;/strong&gt;, right-click, and run as administrator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Navigate to PostgreSQL Folder&lt;/strong&gt;: Use this command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;ostgreSQL&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="s2"&gt;6&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run PostgreSQL in Single-User Mode&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   postgres &lt;span class="nt"&gt;--single&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;ostgreSQL&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="s2"&gt;6&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s2"&gt;ata"&lt;/span&gt; postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reset the Password&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;   &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="n"&gt;postgres&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;PASSWORD&lt;/span&gt; &lt;span class="s1"&gt;'your_new_password'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Restart PostgreSQL&lt;/strong&gt;: Go back to &lt;strong&gt;Services&lt;/strong&gt; and start PostgreSQL again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reconnect with pgAdmin&lt;/strong&gt;: Use the new password to connect.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;I hope this guide makes it easy for you to reset your PostgreSQL password on Windows using single-user mode. It’s a lifesaver when you’re locked out of your database.&lt;/p&gt;

&lt;p&gt;- - - - - - - - - - - - - - - - - - - - - &lt;br&gt;
Stay connected - @syedamaham.dev 🐬&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - -&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>programming</category>
      <category>mysql</category>
    </item>
  </channel>
</rss>
