<?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>DEV Community: Annabelle Wiegart</title>
    <description>The latest articles on DEV Community by Annabelle Wiegart (@annalauraw).</description>
    <link>https://dev.to/annalauraw</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3582989%2F7d3eadc9-6fd9-41f8-9b23-955f0cfa8259.png</url>
      <title>DEV Community: Annabelle Wiegart</title>
      <link>https://dev.to/annalauraw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/annalauraw"/>
    <language>en</language>
    <item>
      <title>My Django on the Med 2026 experience 🏖️</title>
      <dc:creator>Annabelle Wiegart</dc:creator>
      <pubDate>Wed, 30 Sep 2026 20:43:11 +0000</pubDate>
      <link>https://dev.to/annalauraw/my-django-on-the-med-2026-experience-4elb</link>
      <guid>https://dev.to/annalauraw/my-django-on-the-med-2026-experience-4elb</guid>
      <description>&lt;p&gt;&lt;a href="https://djangomed.eu/" rel="noopener noreferrer"&gt;Django on the Med&lt;/a&gt; is a three-day Django development sprint by the Mediterranean Sea, with an emphasis on community building. Its first two editions were organized by Paolo Melchiorre and Carlton Gibson and took place in Palafrugell, Spain and Pescara (Abruzzo), Italy. When I heard of Django on the Med, it sounded like a lot of fun and a great opportunity to work together with other contributors, learn a lot and get more involved in the Django community. That's how I came to join the second edition in September 2026 in Pescara.&lt;/p&gt;

&lt;p&gt;I've been contributing to Django since I was a mentee at the &lt;a href="https://djangonaut.space/" rel="noopener noreferrer"&gt;Djangonaut Space&lt;/a&gt; mentorship program in the fall of 2025. Since then, I have worked on several &lt;a href="https://code.djangoproject.com/" rel="noopener noreferrer"&gt;Django tickets&lt;/a&gt;. Some of them were related to the database layer (ORM), and I wanted to learn more about it and be able to work on more advanced ORM topics. But were my knowledge and experience sufficient to join a Django development sprint? Or was this an event targeted only at hardcore longtime contributors? Well, sure enough, the Django on the Med website it said "experienced contributors, and new ones just starting out". To be sure, I reached out to Paolo on Mastodon, and he assured me that I was welcome. Still, I felt a bit anxious. Would I be able to work together with more advanced contributors? I couldn't properly imagine how my skill level fitted into the picture, also because my developer job does not involve much team work.&lt;/p&gt;

&lt;p&gt;Luckily, folks were discussing possible sprint goals on Slack beforehand. That gave me the opportunity to express my interest in teaming up to work on some ORM topic, and others the opportunity to approach me and make suggestions on what I could work on or what team I could join. Jacob Walls kindly suggested that we could work together on the handling of nullable expressions in the ORM and pointed me to a &lt;a href="https://github.com/django/django/pull/16817" rel="noopener noreferrer"&gt;proof of concept&lt;/a&gt; created by Simon Charette to provide some context. That gave me the possibility to look at the topic beforehand and to get a basic understanding: We were going to work on the issue that in some special cases, the ORM produces an INNER JOIN where an OUTER JOIN would be required, for queries with special null handling like &lt;code&gt;Q(field__in=[1, None])&lt;/code&gt;. I already knew Jacob from code reviews, and it reassured me that I would be able to work with him. &lt;/p&gt;

&lt;p&gt;We kicked off the first sprint day with a great icebreaker session moderated by Carlton. He invited us to brainstorm about the strengths and weaknesses of Django, and asked what everyone was going to work on. By documenting the session output on a flipchart, some of the implicit knowledge in the room was made explicit. Carlton also explicitly asked experienced contributors to mentor newcomers. &lt;br&gt;
When we started working in groups, Jacob and I teamed up and tried to dive deeper into the nullable expressions topic. I really appreciate the way Jacob onboarded me, providing helpful explanations of the context and inviting me to contribute to summarizing our current understanding and suggesting next steps. Sure, I was being mentored, but at the same time, I felt like a peer.&lt;/p&gt;

&lt;p&gt;At some point, Jacob felt we needed the help of Simon, the author of the mentioned proof of concept. That somehow led to me being mentored by Simon for practically the rest of the sprint. It was incredibly helpful to have an ORM expert explain the bigger picture to me and walk me through ORM methods, and I really appreciate Simon's encouragement to (sometime) form my own opinion on the handling of nullable expressions. It makes me feel like my contribution matters, even though I need a lot of help initially.&lt;/p&gt;

&lt;p&gt;Then, something interesting happened: While Simon was explaining the null handling in &lt;code&gt;__in&lt;/code&gt; lookups to me, he found an ORM bug introduced in Django 6.1! Due to an interference between two tickets, &lt;code&gt;.filter()&lt;/code&gt; and &lt;code&gt;.exclude()&lt;/code&gt; with &lt;code&gt;__in&lt;/code&gt; lookups containing &lt;code&gt;None&lt;/code&gt; were not producing complementary querysets anymore. After discovering that, Simon suggested to fix that bug first, and to use it as an entrypoint to understand the broader topic of nullable expressions. So my new sprint goal became creating a &lt;a href="https://code.djangoproject.com/ticket/37372" rel="noopener noreferrer"&gt;ticket&lt;/a&gt; and a &lt;a href="https://github.com/django/django/pull/22040" rel="noopener noreferrer"&gt;PR draft&lt;/a&gt; for the &lt;code&gt;__in&lt;/code&gt; lookup bug, and I was able to accomplish it! That feels incredibly satisfying.&lt;/p&gt;

&lt;p&gt;Through Djangonaut Space and my subsequent contribution, I had interacted with the Django community online, but Django on the Med was my first face-to-face encounter with other Djangonauts. I knew the Django community is a friendly place, but my expectations were exceeded. Everyone was really interested, friendly and supportive. During the lovely afternoon excursions, we were able to connect, learn more about each other's background and find many common interests beyond Django.&lt;/p&gt;

&lt;p&gt;Django on the Med 2026 was an extremely valuable event for me. I feel truly inspired and empowered, with lots of gratitude towards the organizers and sponsors. I hope that other contributors can have a similar experience in future editions! &lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your first django PR - from scratch to improved patch</title>
      <dc:creator>Annabelle Wiegart</dc:creator>
      <pubDate>Fri, 31 Oct 2025 19:19:30 +0000</pubDate>
      <link>https://dev.to/annalauraw/your-first-django-pr-from-scratch-to-improved-patch-5b2f</link>
      <guid>https://dev.to/annalauraw/your-first-django-pr-from-scratch-to-improved-patch-5b2f</guid>
      <description>&lt;h2&gt;
  
  
  A complete walkthrough
&lt;/h2&gt;

&lt;p&gt;You are ready to contribute code to Django, but you feel overwhelmed by the contributing documentation? You wish there was a step-by-step walkthrough from setting up your local environment to making your first pull request? This tutorial is for you.&lt;/p&gt;

&lt;p&gt;I recently made my first pull request to Django. Actually, it was the first pull request I ever made, since I had mainly worked on one-person-projects before. As I went along, I documented the steps, including links to the relevant documentation pages. I started from an existing patch that needed improvement, which is an approach that I recommend for your first ticket.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will focus on the git/github workflow. For additional aspects, such as working with Django's ticket system, please also see &lt;a href="https://dev.to/_e6641d4181e2ba2945d1f/djangonautfirst-pr-week-1-2-929-1010-2ah2"&gt;Rim Choi's blog post&lt;/a&gt;. We will go through the following steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up your local environment&lt;/li&gt;
&lt;li&gt;Finding a ticket to work on&lt;/li&gt;
&lt;li&gt;Working on your ticket&lt;/li&gt;
&lt;li&gt;Going through the contribution checklist&lt;/li&gt;
&lt;li&gt;Creating a pull request&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setting up your local environment
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Getting a copy of Django’s development version
&lt;/h4&gt;

&lt;p&gt;As described in Django's &lt;a href="https://docs.djangoproject.com/en/5.2/intro/contributing/#getting-a-copy-of-django-s-development-version" rel="noopener noreferrer"&gt;contribution tutorial&lt;/a&gt;, fork the Django repo &lt;a href="https://github.com/django/django/fork" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Then, clone your Django fork to your local machine:&lt;br&gt;
&lt;code&gt;git clone https://github.com/YourGitHubName/django.git&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cd django&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Your Django fork is automatically added as a remote repository named "origin". You can verify this with the git remote command:&lt;br&gt;
&lt;code&gt;git remote --verbose&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;As described in &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/working-with-git/#setting-up-local-repository" rel="noopener noreferrer"&gt;Working with Git and GitHub&lt;/a&gt;, you need to add the original Django repository as an additional remote. It's a good convention to call it "upstream":&lt;br&gt;
&lt;code&gt;git remote add upstream https://github.com/django/django.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you have not done so already with &lt;code&gt;git config --global&lt;/code&gt;, configure your username and email address for your local Django git repository:&lt;br&gt;
&lt;code&gt;git config user.name '&amp;lt;your name&amp;gt;'&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git config user.email '&amp;lt;your email&amp;gt;'&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Creating a virtual environment
&lt;/h4&gt;

&lt;p&gt;Create and activate a virtual environment, as described in the &lt;a href="https://docs.djangoproject.com/en/5.2/intro/contributing/#getting-a-copy-of-django-s-development-version" rel="noopener noreferrer"&gt;contribution tutorial&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;python -m venv .venv/&lt;/code&gt;&lt;br&gt;
&lt;code&gt;. .venv/bin/activate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Inside your virtual environment, install your local copy of Django in editable mode:&lt;br&gt;
&lt;code&gt;pip install -e /path/to/your/local/clone/django/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install the test dependencies:&lt;br&gt;
&lt;code&gt;cd tests&lt;/code&gt;&lt;br&gt;
&lt;code&gt;pip install -r requirements/py3.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the installation fails, the cause could be a missing system-level dependency. Just as an example, on Ubuntu 22.04, I had to install the system package libmemcached-dev:&lt;br&gt;
&lt;code&gt;sudo apt install libmemcached-dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After installing the missing system packages, retry the installation of the test dependencies.&lt;/p&gt;

&lt;p&gt;Once the test dependencies are installed, you should be able to run &lt;a href="https://docs.djangoproject.com/en/5.2/intro/contributing/#running-django-s-test-suite-for-the-first-time" rel="noopener noreferrer"&gt;Django's test suite&lt;/a&gt;:&lt;br&gt;
&lt;code&gt;./runtests.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The Django documentation has its own dependencies. You will likely need them later, so go ahead and install them:&lt;br&gt;
&lt;code&gt;cd ../docs&lt;/code&gt;&lt;br&gt;
&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now, change back to the top-level folder of your Django repository, e.g. with &lt;code&gt;cd ..&lt;/code&gt;. Install the &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/coding-style/#coding-style-pre-commit" rel="noopener noreferrer"&gt;pre-commit hooks&lt;/a&gt;:&lt;br&gt;
&lt;code&gt;pip install pre-commit&lt;/code&gt;&lt;br&gt;
&lt;code&gt;pre-commit install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Make sure the pre-commit hooks are working properly:&lt;br&gt;
&lt;code&gt;pre-commit run --all-files&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding a ticket
&lt;/h3&gt;

&lt;p&gt;Finding a beginner-friendly ticket to work on can seem a bit challenging at first. There is an &lt;a href="https://code.djangoproject.com/query?easy=1&amp;amp;stage=Accepted&amp;amp;status=assigned&amp;amp;status=new&amp;amp;order=id&amp;amp;desc=1&amp;amp;col=id&amp;amp;col=summary&amp;amp;col=owner&amp;amp;col=type&amp;amp;col=component" rel="noopener noreferrer"&gt;easy pickings filter&lt;/a&gt;, but tickets with this category are rare and often already assigned. I would recommend you to find the easiest ticket possible, so you can focus on the contribution workflow first. And if your first ticket is a quick success, you will be more motivated to keep going.&lt;/p&gt;

&lt;p&gt;In her excellent video tutorial &lt;a href="https://youtu.be/A-3eTMNQ3rM?si=DWhLKpFBuEb8FawZ&amp;amp;t=761" rel="noopener noreferrer"&gt;Your first Django contribution&lt;/a&gt;, Django fellow Sarah Boyce recommends the so-called "vulture strategy", i.e. working on a patch from a previously submitted pull request that needs improvement. &lt;a href="https://code.djangoproject.com/query?changetime=..6+months+ago&amp;amp;has_patch=1&amp;amp;needs_better_patch=1&amp;amp;stage=Accepted&amp;amp;status=assigned&amp;amp;status=new&amp;amp;time=5+years+ago..&amp;amp;type=Bug&amp;amp;group=component&amp;amp;order=changetime&amp;amp;col=id&amp;amp;col=summary&amp;amp;col=time&amp;amp;col=changetime&amp;amp;col=owner&amp;amp;col=version" rel="noopener noreferrer"&gt;Her filters&lt;/a&gt; are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Triage stage = Accepted&lt;/li&gt;
&lt;li&gt;Has patch = Yes&lt;/li&gt;
&lt;li&gt;Patch needs improvement = Yes&lt;/li&gt;
&lt;li&gt;Created = between 5 years ago and now (I added this one to filter out very old tickets)&lt;/li&gt;
&lt;li&gt;Modified = between indefinite and 6 months ago&lt;/li&gt;
&lt;li&gt;Type = Bug&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jxar18tmwgjxrdxq1u9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jxar18tmwgjxrdxq1u9.png" alt="Django ticket filters for patches that need improvement" width="647" height="643"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can also be helpful to group the resulting ticket list by component:&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%2Fu2ded5gc5wk85y8wew6a.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%2Fu2ded5gc5wk85y8wew6a.png" alt="Option in Django's ticket system to group results by component" width="252" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you decide to work on a ticket, please assign it to yourself. If you are unsure whether someone else is currently working on the ticket, you can leave a comment asking if you can take over. If you don't get a response within 48 h, assigning the ticket to yourself is probably fine. See also &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/submitting-patches/#claiming-tickets" rel="noopener noreferrer"&gt;"Claiming" tickets&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Working on your ticket
&lt;/h3&gt;

&lt;p&gt;The first thing you'll want to do is to &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/working-with-git/#working-on-a-ticket" rel="noopener noreferrer"&gt;create a local branch for your ticket&lt;/a&gt; that is based on the upstream main branch:&lt;br&gt;
&lt;code&gt;git checkout -b ticket_&amp;lt;ticket number&amp;gt; upstream/main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You chose a ticket with an existing patch that needs improvement. There may be several pull requests associated with your ticket. You should always base your work on the most recent patch, as explained in &lt;a href="https://youtu.be/A-3eTMNQ3rM?si=Cw2QoeLJdRv90BOd&amp;amp;t=885" rel="noopener noreferrer"&gt;Sarah Boyce's video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's one way to get the existing patch into your local branch:&lt;br&gt;
&lt;code&gt;curl -L https://github.com/django/django/pull/xxxxx.patch | git am&lt;/code&gt;&lt;br&gt;
See also &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/working-with-git/#working-on-a-patch" rel="noopener noreferrer"&gt;Working on a patch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For reproducing errors and testing your changes, you should work with a &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/submitting-patches/#testing-with-a-django-project" rel="noopener noreferrer"&gt;Django test project&lt;/a&gt; which uses the same virtual environment that you just set up, with your local Django copy installed in editable mode.&lt;/p&gt;

&lt;p&gt;Once you made your changes, you'll probably want to do a commit. That's when the &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/coding-style/#coding-style-pre-commit" rel="noopener noreferrer"&gt;pre-commit hooks&lt;/a&gt; are activated. Their purpose is to catch as many errors before you push them to the remote repository. For instance, your code will be formatted with &lt;a href="https://github.com/psf/black" rel="noopener noreferrer"&gt;black&lt;/a&gt;. You'll need to re-stage the changes made by the pre-commit hooks and retry the commit. You might have to manually fix some errors, too. Here is an example error message for a comment line that is too long:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;flake8...................................................................Failed&lt;/code&gt;&lt;br&gt;
&lt;code&gt;\- hook id: flake8&lt;/code&gt;&lt;br&gt;
&lt;code&gt;\- exit code: 1&lt;/code&gt;&lt;br&gt;
&lt;code&gt;django/conf/locale/de_CH/formats.py:28:80: W505 doc line too long (80 &amp;gt; 79 characters)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In this example, I needed to shorten my comment line to a maximum of 79 characters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Going through the contribution checklist
&lt;/h3&gt;

&lt;p&gt;At this point, you have made one or several commits on your ticket branch to improve the existing patch.You have addressed all the comments in the ticket and in the previous pull request. You think your changes are ready for a new pull request.&lt;/p&gt;

&lt;p&gt;That's when you need to go through the &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/submitting-patches/#contribution-checklist" rel="noopener noreferrer"&gt;contribution checklist&lt;/a&gt;. For your case, i.e. a bug fix that needs improvement, probably all sections are relevant except &lt;em&gt;New Feature&lt;/em&gt; and &lt;em&gt;Deprecating a feature&lt;/em&gt;. I'll pick out a few steps, but please do read the whole checklist and go through all the points that apply.&lt;/p&gt;

&lt;p&gt;Before you go through the contribution checklist, check if the upstream main branch has changed in the meantime. If so, please &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/working-with-git/#after-upstream-has-changed" rel="noopener noreferrer"&gt;rebase your work&lt;/a&gt;:&lt;br&gt;
&lt;code&gt;git fetch upstream&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git rebase upstream/main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now, check whether the documentation builds without any errors. From your local Django directory:&lt;br&gt;
&lt;code&gt;cd docs&lt;/code&gt;&lt;br&gt;
&lt;code&gt;make html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Back inside the top-level Django directory, make sure the test suite passes:&lt;br&gt;
&lt;code&gt;cd tests&lt;/code&gt;&lt;br&gt;
&lt;code&gt;./runtests.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/git-squash-commits/" rel="noopener noreferrer"&gt;Squash&lt;/a&gt; your commits and the commits of previous contributors of the patch into one single commit. Check how many commits you need to edit:&lt;br&gt;
&lt;code&gt;git log -n 10 --oneline&lt;/code&gt;&lt;br&gt;
Let's say you want to squash 3 commits into one:&lt;br&gt;
&lt;code&gt;git rebase -i HEAD~3&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%2F1zlu0yjvjwpifc03ulb2.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%2F1zlu0yjvjwpifc03ulb2.png" alt="Git editor showing the commits to be rebased" width="800" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leave the word &lt;em&gt;pick&lt;/em&gt; next to your last commit. Replace &lt;em&gt;pick&lt;/em&gt; with &lt;em&gt;squash&lt;/em&gt; next to the other two commits.&lt;/p&gt;

&lt;p&gt;Save the file. git will open a new file for you with the combined commit messages. Edit them so they match Django's &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/committing-code/#committing-guidelines" rel="noopener noreferrer"&gt;commit message format&lt;/a&gt;. Don't forget to mention the co-authors of the patch, i.e. the authors of the previous patch which you improved. Example:&lt;br&gt;
&lt;code&gt;Fixed #35095 -- Clarified Swiss number formatting in docs/topics/i18n/formatting.txt.&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Co-Authored-By: Name &amp;lt;email@address&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now you can push your squashed commit to your remote fork:&lt;br&gt;
&lt;code&gt;git push origin ticket_&amp;lt;ticket number&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you messed up the commit message, e.g. you forgot the final period, and you already pushed your changes to your Django fork, you can rewrite the commit message like so:&lt;br&gt;
&lt;code&gt;git rebase -i HEAD~1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Write "reword" next to your commit in the text editor:&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%2Fhzt0u3n4n3sg2l54oahy.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%2Fhzt0u3n4n3sg2l54oahy.png" alt="Git editor showing the commit to be rebased" width="800" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save the file. A new file opens where you can edit your commit message. Make your changes, and save this second file, too. The commit message is now rewritten.&lt;br&gt;
If you had pushed the changes already to your Django fork, you need to force-push the modified commit:&lt;br&gt;
&lt;code&gt;git push --force origin &amp;lt;your branch&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If this is your first Django contribution, please add yourself to the &lt;a href="https://github.com/django/django/blob/main/AUTHORS" rel="noopener noreferrer"&gt;AUTHORS&lt;/a&gt; file and submit a &lt;a href="https://www.djangoproject.com/foundation/cla/" rel="noopener noreferrer"&gt;Contributor License Agreement&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating the pull request
&lt;/h3&gt;

&lt;p&gt;Now it's finally time to make your pull request! As described in the &lt;a href="https://docs.djangoproject.com/en/5.2/intro/contributing/#pushing-the-commit-and-making-a-pull-request" rel="noopener noreferrer"&gt;contributing tutorial&lt;/a&gt;, go to &lt;a href="https://github.com/django/django/" rel="noopener noreferrer"&gt;Django's GitHub page&lt;/a&gt;, or call the URL &lt;a href="https://github.com/GITHUB_USERNAME/django/pull/new/BRANCH_NAME/" rel="noopener noreferrer"&gt;https://github.com/GITHUB_USERNAME/django/pull/new/BRANCH_NAME/&lt;/a&gt;, substituting GITHUB_USERNAME with your actual username, and BRANCH_NAME with the name of your branch.&lt;/p&gt;

&lt;p&gt;Enter a description for the pull request. Mention the ticket number as suggested in the comment. If your patch is based on a previous pull request, mention it in the description. See my &lt;a href="https://github.com/django/django/pull/19933" rel="noopener noreferrer"&gt;example description&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Make sure your ticket appears in the &lt;a href="https://code.djangoproject.com/query?has_patch=1&amp;amp;needs_better_patch=0&amp;amp;needs_docs=0&amp;amp;needs_tests=0&amp;amp;stage=Accepted&amp;amp;status=!closed&amp;amp;order=changetime&amp;amp;desc=1" rel="noopener noreferrer"&gt;review queue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If some GitHub checks fail, you can check the details of the failure via the three little dots next to the test:&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%2Fe3i3jc6m41dcqbddqijw.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%2Fe3i3jc6m41dcqbddqijw.png" alt="Django's GitHub CI tests" width="799" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If some linting- or formatting-related checks fail and you can fix the issue immediately, it is okay to force-push a rewritten commit. In other circumstances, you should avoid force-pushing since it can erase valuable context for the reviewer.&lt;/p&gt;

&lt;p&gt;While your code is being &lt;a href="https://docs.djangoproject.com/en/5.2/internals/contributing/writing-code/working-with-git/#after-review" rel="noopener noreferrer"&gt;reviewed&lt;/a&gt;, you may experience several iterations of the following cycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accept review feedback&lt;/li&gt;
&lt;li&gt;add commits to your local branch&lt;/li&gt;
&lt;li&gt;squash all new local commits into one review commit&lt;/li&gt;
&lt;li&gt;push the review commit to your remote branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are looking for friendly Djangonauts willing to help you, go to the &lt;a href="https://discord.com/channels/856567261900832808/857650722261958666" rel="noopener noreferrer"&gt;#contributing-getting-started&lt;/a&gt; channel on the Django Discord server.&lt;/p&gt;

&lt;p&gt;Don't give up :) I hope your PR gets merged!&lt;/p&gt;

</description>
      <category>django</category>
      <category>opensource</category>
      <category>python</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
