<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Really Roxanna Codes]]></title><description><![CDATA[I am a writer and web developer who is working to transition into cybersecurity and data science.]]></description><link>https://blog.reallyroxanna.codes</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 20:40:52 GMT</lastBuildDate><atom:link href="https://blog.reallyroxanna.codes/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Introduction to Wagtail CMS]]></title><description><![CDATA[NOTE: This tutorial is on my GitHub with the full source code. Check it out at here.
This tutorial assumes some knowledge of Python, Django, and Git/GitHub (optional). If you have experience with none of these, consider following these tutorials befo...]]></description><link>https://blog.reallyroxanna.codes/introduction-to-wagtail-cms</link><guid isPermaLink="true">https://blog.reallyroxanna.codes/introduction-to-wagtail-cms</guid><category><![CDATA[Python]]></category><category><![CDATA[Django]]></category><dc:creator><![CDATA[Roxanna Coldiron]]></dc:creator><pubDate>Sat, 01 Jan 2022 13:15:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/cckf4TsHAuw/upload/v1641042381539/q00qw-z0M.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>NOTE: This tutorial is on my GitHub with the full source code. Check it out at <a target="_blank" href="https://github.com/rcoldiron/wagtail-tutorial">here</a>.</strong></p>
<p>This tutorial assumes some knowledge of Python, Django, and Git/GitHub (optional). If you have experience with none of these, consider following these tutorials beforehand and coming back to this one once you are ready:</p>
<ul>
<li><p><a target="_blank" href="https://docs.python.org/3/tutorial/index.html">The Python Tutorial</a></p>
</li>
<li><p><a target="_blank" href="https://docs.python.org/3/tutorial/venv.html">Python virtual environments</a></p>
</li>
<li><p><a target="_blank" href="https://tutorial.djangogirls.org/en/">Django Girls Tutorial</a></p>
</li>
<li><p><a target="_blank" href="https://docs.djangoproject.com/en/3.2/intro/">Django 3.2 Tutorial</a></p>
</li>
<li><p><a target="_blank" href="https://guides.github.com/introduction/git-handbook/">Git Handbook</a></p>
</li>
</ul>
<h2 id="heading-key-technologies">Key Technologies</h2>
<p>These are the key technologies that we are using for this tutorial:</p>
<ul>
<li><p>Python 3.9</p>
</li>
<li><p>Git and GitHub (if you want to track your code and its versions and/or publish your code)</p>
</li>
<li><p>Wagtail 2.14 (Django 3.2 is included in the package)</p>
</li>
<li><p>Visual Studio Code (or your favorite code editor)</p>
</li>
</ul>
<h2 id="heading-initial-setup">Initial Setup</h2>
<ol>
<li><p>If you want to work with this repo, you can either download the files from GitHub, or fork the repo and clone it to your local machine. Otherwise, make a folder on your local machine to work in and open your command line tool to <code>cd</code> into the folder: <code>cd my-folder</code></p>
</li>
<li><p>Install Python 3.9 if you do not have it on your computer; however, Wagtail 2.14 is compatible with Python 3.6 and up. Check your Python version with <code>python --version</code>.</p>
</li>
</ol>
<blockquote>
<p>NOTE: If it throws an error or doesn't recognize it, you may need to download it. Go to <a target="_blank" href="https://www.python.org/downloads/">Python - Downloads</a> and follow download instructions for your Operating System.</p>
</blockquote>
<ol>
<li><p>Now create a virtual environment: <code>python3 -m venv .venv</code> on Windows 10. The command you have to use may be different, depending on your operating system and version.</p>
</li>
<li><p>Activate the virtual environment: <code>.venv\Scripts\activate.ps1</code> (on Windows 10). If it worked, you should see the name of the virtual environment in the command line before the file path on the next line, similar to the following: <code>(.venv) C:Users/YourName/Your/File/Location:</code></p>
</li>
<li><p>Install Wagtail. This will also install all of its dependencies. I use <code>pip</code> to install, but you may use a different Python package manager. This command is for <code>pip</code>: <code>pip install wagtail</code></p>
</li>
</ol>
<blockquote>
<p>NOTE: The current version at the time of the creation of this repo is Wagtail 2.14. You can select a version to download, like this <code>pip install wagtail==2.14</code></p>
</blockquote>
<ol>
<li>Create the first project: <code>wagtail start myproject .</code> where <code>myproject</code> is the name of the website or project (this can be whatever you want) and the <code>.</code> tells it to create it in your current folder. This command generates the new project files from Wagtail. Please take a moment to look them over.</li>
</ol>
<blockquote>
<p>NOTE: Docker files are automatically generated with the project. While we will not be using them, we are keeping them in the repo in case you want to look them over and learn more about what they do. Docker can be used for deployment. <a target="_blank" href="https://docs.wagtail.io/en/v2.14/reference/project_template.html#dockerfile">READ MORE</a></p>
</blockquote>
<ol>
<li>Navigate into the project: <code>cd myproject</code> and do the first migration with: <code>python manage.py migrate</code>. Next, create a login account for your project with the command <code>python manage.py createsuperuser</code> and follow the prompts. Check if it all worked by running <code>python manage.py runserver</code> and opening your browser to <code>http://127.0.0.1:8000/</code>.</li>
</ol>
<p><strong>Before moving onto the code section, get familiar with the CMS interface. Log into your site at <code>http://127.0.0.1:8000/admin</code> and read the <a target="_blank" href="https://docs.wagtail.io/en/stable/editor_manual/index.html">Wagtail documentation for Editors</a>.</strong></p>
<h2 id="heading-customizing-your-site-part-i">Customizing Your Site - Part I</h2>
<p>Let's start by updating the Home Page model, which is found in <code>home</code> &gt; <code>models.py</code>. The current Home Page model is sub-classed from the Wagtail Page model, but we can add more features and update the template.</p>
<ol>
<li><p>First, we need to decide what we want to have on our Home Page and import any Wagtail components that we think we need. The current Home Page just has the title and no way to add content.</p>
</li>
<li><p>We want to add text to the page. To do this, we need to import <strong>RichTextField</strong>. At the top of the <code>models.py</code>, add the following import:</p>
</li>
</ol>
<pre><code><span class="hljs-keyword">from</span> wagtail.core.fields <span class="hljs-keyword">import</span> <span class="hljs-title">RichTextField</span>
</code></pre><ol>
<li>Now we will add fields to the model.</li>
</ol>
<pre><code><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HomePage</span>(<span class="hljs-params">Page</span>):</span>

    <span class="hljs-comment"># An introduction to our site</span>
    body = RichTextField(null=<span class="hljs-literal">True</span>, blank=<span class="hljs-literal">True</span>)
</code></pre><ol>
<li>Next we need to add content panels to the editor side for the page that will also us to add content. At the top, add the following imports:</li>
</ol>
<pre><code><span class="hljs-keyword">from</span> wagtail.admin.edit_handlers <span class="hljs-keyword">import</span> <span class="hljs-title">FieldPanel</span>
</code></pre><ol>
<li>Then add the content panels to the Home Page model, like this:</li>
</ol>
<pre><code><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HomePage</span>(<span class="hljs-params">Page</span>):</span>

    <span class="hljs-comment"># An introduction to our site</span>
    body = RichTextField(blank=<span class="hljs-literal">True</span>)

    content_panels = Page.content_panels + [
        FieldPanel(<span class="hljs-string">'body'</span>),
    ]
</code></pre><ol>
<li><p>Now we need to run <code>python manage.py makemigrations</code> and <code>python manage.py migrate</code> to see it take effect.</p>
</li>
<li><p>Run the server and log into the admin. Then go into the HomePage to edit it. You should see your new field!</p>
</li>
<li><p>The RichTextField looks like a standard text editor. Write some text, add some photos and links, then republish the page.</p>
</li>
</ol>
<blockquote>
<p>WAIT! None of the content I added shows up on the frontend! Now what?</p>
</blockquote>
<ol>
<li><p>We need to modify the Home Page template to pull in our new field. Templates are found in the app folder under <code>templates</code>. Let's look at the <code>home_page.html</code> template. It uses the Django templating system and has default content added that we can now delete. Delete <code>{% comment %}</code> code, the CSS file link (we will want to replace that), and the line <code>{% include 'home/welcome_page.html' %}</code> because we are going to make our own Home Page content.</p>
</li>
<li><p>We can add a CSS link specific to this page between these two tags: <code>{% block extra_css %} {% endblock extra_css %}</code>; however, the page extends <code>base.html</code>, which is actually found in <code>myproject</code> &gt; <code>static</code> &gt; <code>css</code>. The global CSS link should be added to <code>base.html</code>. For simplicity, we are just going to pull in the Bootstrap CDN but feel free to make your CSS in the <code>myproject,css</code> file. Add it under the <code>{# Global stylesheets #}</code> comment tag and save it.</p>
</li>
<li><p>Now go back to <code>home_page.html</code>. We will put our content within the tags <code>{% block content %} {% endblock content %}</code>. Our code will be:</p>
</li>
</ol>
<pre><code>{<span class="hljs-operator">%</span> extends <span class="hljs-string">"base.html"</span> <span class="hljs-operator">%</span>}
{<span class="hljs-operator">%</span> load static wagtailcore_tags <span class="hljs-operator">%</span>}

{<span class="hljs-operator">%</span> <span class="hljs-built_in">block</span> body_class <span class="hljs-operator">%</span>}template<span class="hljs-operator">-</span>homepage{<span class="hljs-operator">%</span> endblock <span class="hljs-operator">%</span>}

{<span class="hljs-operator">%</span> <span class="hljs-built_in">block</span> extra_css <span class="hljs-operator">%</span>}{<span class="hljs-operator">%</span> endblock extra_css <span class="hljs-operator">%</span>}

{<span class="hljs-operator">%</span> <span class="hljs-built_in">block</span> content <span class="hljs-operator">%</span>}
<span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"container"</span><span class="hljs-operator">&gt;</span>
    <span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"row"</span><span class="hljs-operator">&gt;</span>
        <span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"col-12 text-center border-bottom border-success"</span><span class="hljs-operator">&gt;</span>
            <span class="hljs-operator">&lt;</span>h1<span class="hljs-operator">&gt;</span>{{page.title}}<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>h1<span class="hljs-operator">&gt;</span>
        <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
        <span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"col my-4"</span><span class="hljs-operator">&gt;</span>
            {{page.body|richtext}}
        <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
    <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
{<span class="hljs-operator">%</span> endblock content <span class="hljs-operator">%</span>}
</code></pre><p>I've added some basic Bootstrap classes to style the page a little. We need to load <code>static</code> to pull in CSS and JS, and we need <code>wagtailcore_tags</code> for the special filtering we did for the <code>body</code> field. To include fields in your templates, you put them between curly braces and use dot notation: <code>{{page.body}}</code>. RichTextFields need a <code>richtext</code> filter to display correctly.</p>
<ol>
<li>Save these changes, then <code>python manage.py runserver</code> and edit the Home Page with some content to see it in action!</li>
</ol>
<blockquote>
<p>WHAT OTHER FIELDS CAN YOU ADD TO A PAGE? Well, you can add Django fields like <code>models.CharField</code> and Wagtail StreamField Blocks - check out the <a target="_blank" href="https://docs.wagtail.io/en/stable/reference/streamfield/index.html">StreamField reference</a> to learn more!</p>
</blockquote>
<h2 id="heading-customizing-your-site-part-ii">Customizing Your Site - Part II</h2>
<ol>
<li>Now let's make our own page model and template!</li>
</ol>
<p><strong>I added some new imports at the top, so now my imports look like this:</strong></p>
<pre><code><span class="hljs-keyword">from</span> wagtail.core.models <span class="hljs-keyword">import</span> <span class="hljs-title">Page</span>
<span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-title">wagtail</span>.<span class="hljs-title">core</span> <span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">blocks</span>
<span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-title">wagtail</span>.<span class="hljs-title">core</span>.<span class="hljs-title">fields</span> <span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">RichTextField</span>, <span class="hljs-title">StreamField</span>
<span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-title">wagtail</span>.<span class="hljs-title">admin</span>.<span class="hljs-title">edit_handlers</span> <span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">FieldPanel</span>, <span class="hljs-title">StreamFieldPanel</span>
<span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-title">wagtail</span>.<span class="hljs-title">images</span>.<span class="hljs-title">edit_handlers</span> <span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">ImageChooserPanel</span>
<span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-title">wagtail</span>.<span class="hljs-title">images</span>.<span class="hljs-title">blocks</span> <span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">ImageChooserBlock</span>
</code></pre><ol>
<li>Then I created my basic Web Page model. I added the template to <code>home</code> &gt; <code>templates</code> &gt; <code>home</code> and specified in my model which template I am going to use. Then I added the content fields that I wanted for my Web Page. This is my code:</li>
</ol>
<pre><code>class WebPage(Page):

    cover_image <span class="hljs-operator">=</span> models.ForeignKey(
        <span class="hljs-string">'wagtailimages.Image'</span>,
        null<span class="hljs-operator">=</span>True,
        blank<span class="hljs-operator">=</span>True,
        on_delete<span class="hljs-operator">=</span>models.SET_NULL,
        related_name<span class="hljs-operator">=</span><span class="hljs-string">'+'</span>
    )
    subtitle <span class="hljs-operator">=</span> models.CharField(
        max_length <span class="hljs-operator">=</span> <span class="hljs-number">255</span>,
        null <span class="hljs-operator">=</span> True,
        blank <span class="hljs-operator">=</span> True,
    )
    body <span class="hljs-operator">=</span> StreamField([
        (<span class="hljs-string">'text'</span>, blocks.RichTextBlock(null<span class="hljs-operator">=</span>True, blank<span class="hljs-operator">=</span>True)),
        (<span class="hljs-string">'image'</span>, ImageChooserBlock(null<span class="hljs-operator">=</span>True, blank<span class="hljs-operator">=</span>True)),
        ],
        blank<span class="hljs-operator">=</span>True,
    )

    template<span class="hljs-operator">=</span><span class="hljs-string">"home/web_page.html"</span>

    content_panels <span class="hljs-operator">=</span> Page.content_panels <span class="hljs-operator">+</span> [
        ImageChooserPanel(<span class="hljs-string">'cover_image'</span>),
        FieldPanel(<span class="hljs-string">'subtitle'</span>),
        StreamFieldPanel(<span class="hljs-string">'body'</span>),
    ]
</code></pre><ol>
<li><p>Go ahead and <code>makemigrations</code> and <code>migrate</code>.</p>
</li>
<li><p>Now in our <code>web_page.html</code> template, we can copy some of the code from the Home Page template. We will need to load <code>wagtailimages_tags</code> at the top, though, because we have images in this model that are not in the RichTextField.</p>
</li>
</ol>
<blockquote>
<p>NOTE: You can use logic in Wagtail templates the same way you use them in Django templates! Remember that Wagtail uses the same templating system as Django.</p>
</blockquote>
<ol>
<li>This is the code for my template (with very basic layout and styling):</li>
</ol>
<pre><code>{<span class="hljs-operator">%</span> extends <span class="hljs-string">"base.html"</span> <span class="hljs-operator">%</span>}
{<span class="hljs-operator">%</span> load static wagtailcore_tags wagtailimages_tags <span class="hljs-operator">%</span>}

{<span class="hljs-operator">%</span> <span class="hljs-built_in">block</span> body_class <span class="hljs-operator">%</span>}template<span class="hljs-operator">-</span>homepage{<span class="hljs-operator">%</span> endblock <span class="hljs-operator">%</span>}

{<span class="hljs-operator">%</span> <span class="hljs-built_in">block</span> extra_css <span class="hljs-operator">%</span>}{<span class="hljs-operator">%</span> endblock extra_css <span class="hljs-operator">%</span>}

{<span class="hljs-operator">%</span> <span class="hljs-built_in">block</span> content <span class="hljs-operator">%</span>}
<span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"container-fluid"</span><span class="hljs-operator">&gt;</span>
    <span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"row"</span><span class="hljs-operator">&gt;</span>
        {<span class="hljs-operator">%</span> <span class="hljs-keyword">if</span> page.cover_image <span class="hljs-operator">%</span>}
        {<span class="hljs-operator">%</span> image page.cover_image fill<span class="hljs-operator">-</span>2000x1000 <span class="hljs-keyword">as</span> cover_image <span class="hljs-operator">%</span>}
        <span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"col-12 py-5 text-white text-center"</span> style<span class="hljs-operator">=</span><span class="hljs-string">"background-image:url({{cover_image.url}});background-repeat:no-repeat;"</span><span class="hljs-operator">&gt;</span>
            <span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"py-3"</span><span class="hljs-operator">&gt;</span>
                <span class="hljs-operator">&lt;</span>h2<span class="hljs-operator">&gt;</span>{{page.title}}<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>h2<span class="hljs-operator">&gt;</span>
                <span class="hljs-operator">&lt;</span>h3<span class="hljs-operator">&gt;</span>{{page.subtitle}}<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>h3<span class="hljs-operator">&gt;</span>
            <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
        <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
        {<span class="hljs-operator">%</span> endif <span class="hljs-operator">%</span>}
    <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>

<span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"container"</span><span class="hljs-operator">&gt;</span>
    <span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"row my-3"</span><span class="hljs-operator">&gt;</span>
        {<span class="hljs-operator">%</span> <span class="hljs-keyword">for</span> <span class="hljs-built_in">block</span> in page.body <span class="hljs-operator">%</span>}
        <span class="hljs-operator">&lt;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">"col-12"</span><span class="hljs-operator">&gt;</span>
            {<span class="hljs-operator">%</span> include_block <span class="hljs-built_in">block</span> <span class="hljs-operator">%</span>}
        <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
        {<span class="hljs-operator">%</span> endfor <span class="hljs-operator">%</span>}
    <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">&gt;</span>
{<span class="hljs-operator">%</span> endblock content <span class="hljs-operator">%</span>}
</code></pre><ol>
<li>Now <code>runserver</code>, create a new Web Page, add some content, and see what it looks like!</li>
</ol>
<p>You have just created a Wagtail website! CONGRATULATIONS! 🎉🎉🎉</p>
<p><strong>Wagtail is fun to build and easy to use for editors.</strong></p>
<h2 id="heading-next-steps">Next Steps</h2>
<p>Add more pages, further customize your templates, and play around with the editor.</p>
]]></content:encoded></item><item><title><![CDATA[4 Useful WordPress Plugins For Developers]]></title><description><![CDATA[WordPress is a popular Content Management System (CMS). Its popularity is due to its ease of use for non-developers. People can create websites and post online content without needing to code (or knowing how to do it); however, businesses and individ...]]></description><link>https://blog.reallyroxanna.codes/4-useful-wordpress-plugins-for-developers</link><guid isPermaLink="true">https://blog.reallyroxanna.codes/4-useful-wordpress-plugins-for-developers</guid><category><![CDATA[wordpress plugins]]></category><dc:creator><![CDATA[Roxanna Coldiron]]></dc:creator><pubDate>Wed, 18 Nov 2020 22:19:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1605737930968/LfaY1N-Nr.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>WordPress is a popular Content Management System (CMS). Its popularity is due to its ease of use for non-developers. People can create websites and post online content without needing to code (or knowing how to do it); however, businesses and individuals often need customization for their sites.  This is when they hire a WordPress developer to handle the customization.</p>
<p>In a perfect developer scenario, the client will provide access to everything we need to update their website. We would have access to their web host and to their FTP/SFTP. We do not live in an ideal world, though. You will come across a client who does not want to give that level of access. Not having access to important aspects of the website for development can make it more difficult to do our jobs. </p>
<p>The one non-negotiable for developing WordPress sites is that the client needs to set up an administrative user to their WordPress or else we cannot do a single thing for the site. If all we have is administrative user privileges, it will be enough to do what we need to do — especially with these four useful WordPress plugins. </p>
<p><em>IMPORTANT NOTE: Use the plugins when you need to use them and delete them when you are done. Plugins that you no longer need bog down the website and also present a security risk.</em></p>
<h2 id="1-wp-file-manager">1. WP File Manager</h2>
<p>What do you do when you need to add more files to the Child Theme for the website? The Theme Editor doesn't let you upload new folders or files. You may need to add files to the theme because you want to override a plugin theme or the Parent Theme, but it will be difficult to do this without FTP/SFTP access. </p>
<p>The <a target="_blank" href="https://wordpress.org/plugins/wp-file-manager/"> WP File Manager</a> plugin is useful in this situation. Install and activate the plugin on their site. Go to the File Manager that now shows up in the Dashboard and upload the folders and files that you need to customize the theme. Check that the folders/files are uploaded by going to the Theme Editor. Then you can deactivate and delete the plugin until you need it again. Now you're able to update the code for the theme in the Theme Editor!</p>
<h2 id="2-duplicate-page">2. Duplicate Page</h2>
<p>Let's say that you customized a page using theme tools or website builder plugins. If you need to have several pages that look that way, duplicating the page would make it easier to do so. No need to repeat your customization for that page! </p>
<p>The  <a target="_blank" href="https://wordpress.org/plugins/duplicate-page/">Duplicate Page</a> plugin lets you clone a page or post with a click! The option to clone a page will now show below the page/post title in the Dashboard area. Clone the page or post as many times as you need to do so, and update its content as necessary.</p>
<h2 id="3-pods-framework">3. Pods Framework</h2>
<p>I discovered Pods when I needed to make a very specific post type for a data set. The  <a target="_blank" href="https://pods.io/">Pods Framework</a> gives you power to create custom content types. It's very versatile, so you can build almost anything using Pods. Start by installing and activating the  <a target="_blank" href="https://wordpress.org/plugins/pods/">Pods plugin</a> , then begin building your content types. </p>
<p>The learning curve for Pods may be a little steep, especially if you are new to WordPress development. You can find plenty of tutorials on their website. There is also a  <a target="_blank" href="https://support.pods.io/chat/">Slack group by Pods</a> that you can join for additional help. Your Pods can then be fully customized with CSS. </p>
<h2 id="4-under-construction">4. Under Construction</h2>
<p>Your client likely doesn't want their website to be visible on the internet before it is ready. If you don't have access to a staging site, then Under Construction can hide your WordPress site from the web. You can add some basic HTML to show on the site instead whenever people visit the domain. When you are logged into WordPress, you will be able to see all of the WordPress content and make your changes and updates. </p>
<p>The  <a target="_blank" href="https://wordpress.org/plugins/under-construction-page/">Under Construction</a>  plugin can be turned on and off. You can show the client your progress on the site by having them log into the site, or by presenting your work while you are logged in. The plugin can be deactivated and deleted once you are done with the customization and the client has approved the site to go live.</p>
<p>Do you use any other plugins when you are developing or customizing a WordPress site for a client? </p>
<p><em>(Image by <a href="https://pixabay.com/users/pixelcreatures-127599/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=265132">Werner Moser</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=265132">Pixabay</a>)</em></p>
]]></content:encoded></item><item><title><![CDATA[How To Plan A Django Project]]></title><description><![CDATA[I am a new Django developer, and one of the things that seemed difficult for me at first was getting started. I looked at my employer's large Django projects, with their multiple apps and multiple layers, and felt overwhelmed at the thought of trying...]]></description><link>https://blog.reallyroxanna.codes/how-to-plan-a-django-project</link><guid isPermaLink="true">https://blog.reallyroxanna.codes/how-to-plan-a-django-project</guid><category><![CDATA[Django]]></category><dc:creator><![CDATA[Roxanna Coldiron]]></dc:creator><pubDate>Fri, 13 Nov 2020 16:51:08 GMT</pubDate><content:encoded><![CDATA[<p>I am a new Django developer, and one of the things that seemed difficult for me at first was getting started. I looked at my employer's large Django projects, with their multiple apps and multiple layers, and felt overwhelmed at the thought of trying to build my own robust Django project. </p>
<p>What is the best way to get started on such a feat? The answer is simply this: <strong>Good, old-fashioned planning</strong>. </p>
<h2 id="start-with-these-questions">Start with these questions</h2>
<p>Whenever you begin planning, you have to ask yourself a few questions. Some of the questions that can help you in the planning phase of your Django project include the following:</p>
<ul>
<li>What is the purpose of your Django project?</li>
<li>What functionality does your project need to have to meet that purpose?</li>
<li>Which models will you need to have for your project?</li>
<li>What relationships between models will you need to make?</li>
<li>What do you want to use for handling the front-end of the site?</li>
</ul>
<p>At this stage, you only need to jot down a few answers to these questions. You will need to expand them in the next planning step, but this will help to point you in the right direction.</p>
<h2 id="plan-your-structure">Plan your structure</h2>
<p>Now you need to have an idea of what structure you will have to have. Are you going to have multiple apps to handle different parts of the project? Are you planning on using Python/Django packages instead of recreating the wheel? You can map out your project's structure on a piece of paper, or use a virtual whiteboard. </p>
<p>The structure of your Django project determines how each component of it works together. If you know ahead of time how you want to handle the relationships between your apps, it makes it that much easier to do it. It also makes a solo project less overwhelming!</p>
<h2 id="determine-your-models">Determine your models</h2>
<p>One of the things that I have learned over the last few months at my apprenticeship and in my coding bootcamp is that Django is really all about models and their relationships with each other. In the bootcamp (Coding Dojo shoutout!), we used the  <a target="_blank" href="https://www.mysql.com/products/workbench/">MySQL Workbench</a>  tool to make an Entity Relationship Diagram (ERD) — a visual representation of your models and how they connect. This is helpful because then you can visually identify whether your model needs a One-To-Many or Many-To-Many relationship with another model. </p>
<p>You can also take it out a piece of paper and write down the fields that you want your models to have, how they connect, and what the related names will be for your fields in the models that they have a relationship with. I like doing this because then I can see what I need to reference in any CRUD commands that I use in my views or in my templates. </p>
<h2 id="dont-forget-the-front-end">Don't forget the front-end</h2>
<p>Of course, you want to build your database models before you start working on the front end of your site; however, the front end is very important. This is where your users or site visitors will interact with your project. How can you make it the best experience for them? Just as you planned the Django back-end for your project, you also need to plan for the front-end. </p>
<p>You could create a front-end prototype of your site on Figma or in Photoshop that shows how people may navigate your site. If you like pen and paper, it's okay to wireframe your site in that format, too. Do whatever works for planning the front-end of the site and understand what it needs to have for people to use your site. </p>
<p>That is all that I have for now! I hope to eventually begin adding some tutorials on the things I have learned. Django is a great back-end framework, and I enjoy working with it. Until next time....</p>
]]></content:encoded></item></channel></rss>