<?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: Quinn</title>
    <description>The latest articles on DEV Community by Quinn (@qosha1).</description>
    <link>https://dev.to/qosha1</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%2F455919%2Fe7ffc7e8-4212-4cde-9a1a-d4086d56987d.jpeg</url>
      <title>DEV Community: Quinn</title>
      <link>https://dev.to/qosha1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qosha1"/>
    <language>en</language>
    <item>
      <title>I Built an AI Crochet Pattern Engine Using Browser Agents (Debugg.ai + Claude Code + OpenAI) for my Sister</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Tue, 17 Mar 2026 18:31:02 +0000</pubDate>
      <link>https://dev.to/qosha1/i-built-an-ai-crochet-pattern-engine-using-browser-agents-debuggai-claude-code-openai-for-my-ec7</link>
      <guid>https://dev.to/qosha1/i-built-an-ai-crochet-pattern-engine-using-browser-agents-debuggai-claude-code-openai-for-my-ec7</guid>
      <description>&lt;p&gt;Most people think browser agents are for QA, scraping, or growth automation.&lt;/p&gt;

&lt;p&gt;I wanted to test something weirder:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can you fully automate a &lt;em&gt;creative&lt;/em&gt;, messy, human workflow like crocheting?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Turns out — yes. And it’s a perfect stress test for agent reliability.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Idea
&lt;/h2&gt;

&lt;p&gt;Crochet patterns are essentially &lt;strong&gt;programs written for humans&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step-by-step instructions&lt;/li&gt;
&lt;li&gt;Stateful execution (you can’t skip rows)&lt;/li&gt;
&lt;li&gt;Error-prone (one missed stitch breaks everything)&lt;/li&gt;
&lt;li&gt;Inconsistent formatting across the internet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes them ideal for testing &lt;strong&gt;agentic workflows over real UIs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To ground this, I used real-world pattern flows from sites like the one I built for my sister:&lt;br&gt;
👉 &lt;a href="https://www.crochet.com/" rel="noopener noreferrer"&gt;Crochets.site Crocheting Page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are many types of general resources sites that provide structured + semi-structured patterns, materials, and UI interactions — perfect for agent testing.&lt;/p&gt;


&lt;h2&gt;
  
  
  🏗️ System Architecture
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                ┌──────────────────────┐
                │   Surfs.dev Agents   │
                │ (browser execution)  │
                └─────────┬────────────┘
                          │
        ┌─────────────────┼─────────────────┐
        │                 │                 │
        ▼                 ▼                 ▼
 Pattern Sites     Pattern Editor UI   Test Runner (Debugg.ai)
 (scraping)         (Next.js app)        (validation layer)

        │
        ▼
   OpenAI / Claude
 (parsing + generation)

        │
        ▼
 Structured Pattern JSON
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔍 Step 1: Scraping Real Patterns
&lt;/h2&gt;

&lt;p&gt;Using Surfs.dev agents (real browser sessions), I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate crochet sites&lt;/li&gt;
&lt;li&gt;Extract rows, stitch counts, materials&lt;/li&gt;
&lt;li&gt;Handle messy UI (expandable notes, dynamic sections)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why not traditional scraping?&lt;/p&gt;

&lt;p&gt;Because most pattern sites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aren’t clean HTML&lt;/li&gt;
&lt;li&gt;Require interaction&lt;/li&gt;
&lt;li&gt;Break easily&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Browser agents solve this.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 Step 2: Structuring with LLMs
&lt;/h2&gt;

&lt;p&gt;Raw pattern example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Row 3: Ch 1, *sc in next st, inc; rep from * around. (18 sts)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Converted into structured JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"row"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stitches"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"repeat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Model Roles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; → deterministic parsing + schema output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; → reasoning, cleanup, transformations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🪄 Step 3: Generating Variations
&lt;/h2&gt;

&lt;p&gt;Once structured, patterns become programmable.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Make it longer” → extend BODY rows&lt;/li&gt;
&lt;li&gt;“Add ribbing” → inject BLO stitches&lt;/li&gt;
&lt;li&gt;“Convert to child size” → adjust stitch counts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crochet becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A DSL for physical objects&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧪 Step 4: Testing with Debugg.ai
&lt;/h2&gt;

&lt;p&gt;This is the key unlock.&lt;/p&gt;

&lt;p&gt;We treat patterns like &lt;strong&gt;end-to-end tests&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What gets validated:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Stitch counts per row&lt;/li&gt;
&lt;li&gt;Logical progression&lt;/li&gt;
&lt;li&gt;UI rendering&lt;/li&gt;
&lt;li&gt;Instruction clarity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One bad row = broken output&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🤖 Step 5: Execution via Browser Agents
&lt;/h2&gt;

&lt;p&gt;Agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load pattern UI&lt;/li&gt;
&lt;li&gt;Click through steps&lt;/li&gt;
&lt;li&gt;Expand notes&lt;/li&gt;
&lt;li&gt;Simulate a human following instructions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replayable sessions&lt;/li&gt;
&lt;li&gt;Failure logs&lt;/li&gt;
&lt;li&gt;Deterministic debugging&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Data is messy
&lt;/h3&gt;

&lt;p&gt;Different sites = different formats&lt;br&gt;
→ solved with LLM normalization&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Fully stateful system
&lt;/h3&gt;

&lt;p&gt;Each row depends on the last&lt;br&gt;
→ solved with full agent simulation&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Tiny errors compound
&lt;/h3&gt;

&lt;p&gt;→ solved with Debugg.ai validation loops&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Why This Matters
&lt;/h2&gt;

&lt;p&gt;Crochet is just a proxy.&lt;/p&gt;

&lt;p&gt;The real insight:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Most real workflows are not APIs — they’re UI-driven systems.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SaaS dashboards&lt;/li&gt;
&lt;li&gt;Internal tools&lt;/li&gt;
&lt;li&gt;Marketplaces&lt;/li&gt;
&lt;li&gt;Creative workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If agents can handle crochet patterns reliably:&lt;br&gt;
they can handle almost anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Key Takeaway
&lt;/h2&gt;

&lt;p&gt;Crochet patterns are:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Programs for humans&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And with Debugg.ai + Surfs.dev:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;They become programs that can be tested, executed, and improved by agents.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you’re building agent workflows (growth, ops, QA, etc.), I’d love to see what you’re working on.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>browser</category>
      <category>agenticbrowser</category>
    </item>
    <item>
      <title>Basic Example of a Custom Django Form</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Sat, 15 Apr 2023 16:49:27 +0000</pubDate>
      <link>https://dev.to/qosha1/basic-example-of-a-custom-django-form-5ln</link>
      <guid>https://dev.to/qosha1/basic-example-of-a-custom-django-form-5ln</guid>
      <description>&lt;p&gt;Django is a popular Python web framework that offers a lot of flexibility and customization options. One of the most powerful features of Django is its ability to create custom form classes that can be used to manipulate data in your models. &lt;/p&gt;

&lt;p&gt;In this article, we'll show you how to create a custom form class for a Django model field. &lt;/p&gt;

&lt;p&gt;We'll be writing additional how-tos for more complicated use cases that we've come across for our automotive platform. For instance when handling addresses in our analytics platform (see &lt;a href="https://www.topmarq.com/dealers/reviews/lone-star-chevrolet/"&gt;Lonestar Chervolet&lt;/a&gt; ), things become much more complicated as a single field in the form actually consists of many components like city, state, lat/lng, etc. But as always, you have to start with the basics! &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Define the model
&lt;/h2&gt;

&lt;p&gt;Before you can create a custom form class for a model field, you need to define the model itself. Let's say, for example, that we want to create a custom form class for a field called "age" in a "Person" model. Here's what the model might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=255)
    age = models.IntegerField()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Create the form class
&lt;/h2&gt;

&lt;p&gt;Now that you have your model defined, you can create the custom form class for the "age" field. To do this, you'll need to create a new Python file in your Django app and define a new class that inherits from the base form class (in this case, forms.ModelForm).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django import forms
from .models import Person

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['age']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we've defined a new form class called "PersonForm" that only includes the "age" field from our Person model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Customize the form class
&lt;/h2&gt;

&lt;p&gt;Now that you have a basic form class, you can customize it to fit your needs. For example, you might want to add validation to the form to make sure that the user enters a valid age. You can do this by adding a new method to the PersonForm class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['age']

    def clean_age(self):
        age = self.cleaned_data['age']
        if age &amp;lt; 0 or age &amp;gt; 120:
            raise forms.ValidationError('Invalid age')
        return age
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we've added a new method called clean_age() that checks to make sure that the age entered by the user is between 0 and 120. If the age is outside of this range, we raise a validation error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Use the custom form in your views
&lt;/h2&gt;

&lt;p&gt;Finally, you can use your custom form class in your views. Here's an example of how you might use the PersonForm class to create a new person record in your database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.shortcuts import render
from .forms import PersonForm

def create_person(request):
    if request.method == 'POST':
        form = PersonForm(request.POST)
        if form.is_valid():
            form.save()
            return render(request, 'success.html')
    else:
        form = PersonForm()
    return render(request, 'create_person.html', {'form': form})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we've created a new view called "create_person" that uses the PersonForm class to create a new person record in the database. When the user submits the form, we validate it using the is_valid() method. If the form is valid, we save the record and display a success message. If the form is not valid, we display an error message and allow the user to correct their input.&lt;/p&gt;

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

&lt;p&gt;In this article, we've shown you how to create a custom form class for a Django model field. By defining your own form classes, you can add validation, custom widgets, and other features to your Django forms. This gives you a lot of flexibility and customization options when working with Django.&lt;/p&gt;

</description>
      <category>django</category>
      <category>djangoforms</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Analytics with Django &amp; Chart.js - Simpler Than Expected</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Tue, 28 Feb 2023 17:34:13 +0000</pubDate>
      <link>https://dev.to/qosha1/analytics-with-django-chartjs-simpler-than-expected-37li</link>
      <guid>https://dev.to/qosha1/analytics-with-django-chartjs-simpler-than-expected-37li</guid>
      <description>&lt;p&gt;Recently, we decided to expand our car selling platform with a new search feature that allowed consumers to &lt;a href="https://www.topmarq.com/dealership-finder"&gt;search for dealerships in their area&lt;/a&gt; based on unique metrics that we extract from their historic inventory data like average prices, models, and more. &lt;/p&gt;

&lt;p&gt;To do this, we had to dive into front-end charting for the first time. Our django / python backend has been great for us across a variety of features we've built, but our team's Javascript experience is significantly less than python. As such in our search for the ideal charting library we were hesitant to dive too deep into complicated js options or things that required heavy lifting on setup. &lt;/p&gt;

&lt;p&gt;A few options we considered:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recharts&lt;/li&gt;
&lt;li&gt;CanvasJS&lt;/li&gt;
&lt;li&gt;C3.js&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chartjs.org/docs/latest/"&gt;Chart.js&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ultimately we decided to go with Chart.js because of a few main benefits. First, it's very low setup cost made playing around with its features quick and easy. Second, it is very well adopted across many platforms and offers clean and thorough documentation &amp;amp; support. There's nothing more frustrating than bringing on a new library that turns out to be a huge headache to understand or find documentation for. &lt;/p&gt;

&lt;p&gt;Despite our initial concerns that this foray into a javascript only library was going to be a tough journey, adding chart.js to our django platform ended up being a cinch. &lt;/p&gt;

&lt;p&gt;To get started, you just have to add the package to the page you'd like to add charts to:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;script src="https://cdn.jsdelivr.net/npm/chart.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note there may also be an option to add a charting library directly to your python environment using &lt;code&gt;pip install django-charts&lt;/code&gt;. For simplicity and ease of starting, we just added the script library to our required pages. &lt;/p&gt;

&lt;p&gt;Once you've added the script, you can then start generating charts with their pretty simple constructor calls. &lt;/p&gt;

&lt;p&gt;We had our 'x-axis' data in a dictionary key accessed with:&lt;br&gt;
&lt;code&gt;inventory.new.models.items.model&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We had our 'y-axis' data in a dictionary key accessed with:&lt;br&gt;
&lt;code&gt;inventory.new.models.items.num&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To generate the chart we simply use django templating to loop through the dictionaries in the chart instantiation script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script async&amp;gt;
        const ctx = document.getElementById('newInventoryChart');

        new Chart(ctx, {
            type: 'bar',
            data: {
              labels: [
                    {% for model, num in inventory.new.models.items %}'{{ model }}',{% endfor %}
                ],
              datasets: [{
                label: '# of Vehicles in stock',
                data: [
                    {% for model, num in inventory.new.models.items %}{{ num }},{% endfor %}
                ],
                borderWidth: 1,
                backgroundColor: '#17428f'
              }]
            },
            options: {
              scales: {
                y: {
                  beginAtZero: true
                }
              },
              aspectRatio: 1
            }
        });
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you've done this, you're pretty much done. All you need to do is ensure you have an html tag somewhere that matches the 'id' that you used in the chart constructor. Chart.js will automatically take care of generating the visual for you on page load. &lt;/p&gt;

&lt;p&gt;For now, we have a mix of charts and basic metrics for each dealership, but plan to expand the single-point metrics into over-time charting with the library. For instance, &lt;a href="https://www.topmarq.com/dealers/reviews/bayway-chevrolet/"&gt;Bayway Chevrolet&lt;/a&gt; below shows the average price, most popular model, and number of vehicles sold across both the new and used car departments. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gud1dyft--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ul0kxniilm7rs858tpyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gud1dyft--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ul0kxniilm7rs858tpyo.png" alt="Example of metrics for a car dealership" width="880" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We would like to be able to add the ability to on-the-fly generate new charts based on user input. For instance, if the user is searching for Silverados they could click to filter by model and get detailed metrics for just that vehicle. Eg. pricing changes, popular features, cost to own, etc. &lt;/p&gt;

&lt;p&gt;Because it's relatively expensive from a load time perspective to just add all possible charts in the initial template, we expect to build out additional REST APIS that will allow the frontend to pull new chart data as it's needed. &lt;/p&gt;

&lt;p&gt;I hope this has been helpful to anyone considering adding Chartjs to their django application and would be happy to answer any questions in the comments. As I mentioned, it is quite easy to get up and running and you shouldn't be concerned if you're not a JS pro!&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>chartjs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Payments - an unforeseen roadblock</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Fri, 25 Dec 2020 21:11:48 +0000</pubDate>
      <link>https://dev.to/qosha1/payments-an-unforeseen-roadblock-5d27</link>
      <guid>https://dev.to/qosha1/payments-an-unforeseen-roadblock-5d27</guid>
      <description>&lt;p&gt;I've been working on a website for used car buyers who want to skip handling the &lt;a href="https://www.topmarq.com/articles/the-pre-purchase-inspection-a-key-step-to-ensure-you-buy-the-right-car-84"&gt;pre purchase inspection&lt;/a&gt; step themselves by having everything already done. It's a new version of the peer-to-peer marketplace with some tweaks to avoid problems that companies like beepi ran into. The hope is by focusing on higher-end &lt;a href="https://www.topmarq.com/articles/are-foreign-cars-really-worth-the-upkeep-and-costs-79"&gt;foreign cars&lt;/a&gt;, which are much harder to sell for a good price to large auto dealers, we can carve out a bit of a niche market. &lt;/p&gt;

&lt;p&gt;Car buyers can ensure that all the &lt;a href="https://www.topmarq.com/articles/the-complete-bmw-service-guide-keeping-you-and-your-bmw-on-the-road-78"&gt;vehicles service&lt;/a&gt; has been done appropriately and the inspection shows any indication of potential repair costs coming down the road. All seemed good!&lt;/p&gt;

&lt;p&gt;The interesting thing this week though was that after assuming I could use Stripe connect, I chatted with one of their growth team members and apparently they didn't 'like the business model' such that they won't facilitate payments for the company. Now, there are definitely other options and I will make it work, but I definitely did not see that coming. The application fits quite well into their 'Stripe Connect' marketplace functionality so it took me a bit by surprise. &lt;/p&gt;

&lt;p&gt;Stripe is great for handling basic CC payments on SaaS software but be warned - if you are venturing into anything outside of the immediately basic, they may just avoid the risk. My guess is that if you have some revenue they'd be more willing to investigate more. &lt;/p&gt;

&lt;p&gt;Moral of the story - check before you assume you can use Stripe with your new business.&lt;/p&gt;

</description>
      <category>stripe</category>
      <category>payments</category>
    </item>
    <item>
      <title>Use Django to Add Schema for Rich Results</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Sun, 11 Oct 2020 18:53:26 +0000</pubDate>
      <link>https://dev.to/qosha1/use-django-to-add-schema-for-rich-results-a0a</link>
      <guid>https://dev.to/qosha1/use-django-to-add-schema-for-rich-results-a0a</guid>
      <description>&lt;p&gt;I recently went through the process of learning about Schema markup and how to use it and figured I would share what I ended up with. &lt;/p&gt;

&lt;p&gt;For my website, I built a feature where users can search for different car shows that are going on in their area but I wanted the results to be able to show up similar to how they do on Eventbrite and the other larger sites so I started to investigate Schema. Generally, it's pretty self explanatory once you go through a few of the examples at their docs page:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://schema.org/Event"&gt;https://schema.org/Event&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, I was using Django and wanted to make sure that the results could be looped through using the Django template engine. For instance, for &lt;a href="https://www.topmarq.com/car-shows/tx/houston"&gt;car shows in houston&lt;/a&gt; I just set the Event markup to loop through the queryset and use the appropriate data pieces. Of course, you'll need to put in you specific model attributes. See the full example of what I used below. Just add this code to the rest of your scripts and you'll be off to the races. &lt;/p&gt;

&lt;p&gt;You'll also likely want to add the single event markup to the detail page of your events. &lt;/p&gt;

&lt;p&gt;While generally pretty straightforward, the json code is very particular about ending commas so you have to make sure the last one isn't there with an if statement. Google search console will also still suggest that you add a few additional parameters if you use the rich text results tool that they provide. These aren't dealbreakers though so you can choose to implement or not.&lt;/p&gt;

&lt;p&gt;Hope this helps on your journey to improve your site with Rich Results!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;script type="application/ld+json"&amp;gt;&lt;br&gt;
    [&lt;br&gt;
        {% for event in events %}&lt;br&gt;
        {&lt;br&gt;
          "@context": "https://schema.org",&lt;br&gt;
          "@type": "Event",&lt;br&gt;
          "name": "{{ event.title }}",&lt;br&gt;
          "description": "{{ event.description }}",&lt;br&gt;
          "image": "{{ event.logo.url }}",&lt;br&gt;
          "location": {&lt;br&gt;
            "@type": "Place",&lt;br&gt;
            "address": {&lt;br&gt;
              "@type": "PostalAddress",&lt;br&gt;
              "addressLocality": "{{ event.locality.name }}",&lt;br&gt;
              "addressRegion": "{{ event.state.code }}",&lt;br&gt;
              "postalCode": "{{ event.postal_code }}",&lt;br&gt;
              "streetAddress": "{{ event.street_address }}"&lt;br&gt;
            },&lt;br&gt;
            "geo":{&lt;br&gt;
              "@type":"GeoCoordinates",&lt;br&gt;
              "latitude":"{{ event.location.latitude }}",&lt;br&gt;
              "longitude":"{{ event.location.longitude }}"&lt;br&gt;
            }&lt;br&gt;
          },&lt;br&gt;
          "startDate": "{{ event.start_time|date:'c' }}",&lt;br&gt;
          "endDate": "{{ event.end_time|date:'Y-m-d' }}T{{ event.end_time|time:'H:i' }}",&lt;br&gt;
          "url": "{{ event.get_absolute_url }}"&lt;br&gt;
        }{% if not forloop.last %},{% endif %}&lt;br&gt;
        {% endfor %}&lt;br&gt;
    ]&lt;br&gt;
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;

</description>
      <category>django</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How To Use Multiple Markdown Fields for Articles?</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Fri, 25 Sep 2020 03:08:07 +0000</pubDate>
      <link>https://dev.to/qosha1/how-best-to-use-markdown-fields-for-articles-pp3</link>
      <guid>https://dev.to/qosha1/how-best-to-use-markdown-fields-for-articles-pp3</guid>
      <description>&lt;p&gt;I've been working on a site for a few months and made the (potentially questionable) decision to build the thing from scratch using JQuery/Django/Python/Postgres. I've found that although the front-end work of the platform can be quite difficult, all that matters is that it works for the user. &lt;/p&gt;

&lt;p&gt;This is different when it comes to the blog/forum/whatever you want to call it because the search engines and webmasters expect you to do very specific things in terms of structure. &lt;/p&gt;

&lt;p&gt;I'm using markdown fields for the article content which I think is pretty typical. I have no issue integrating a header image followed by text. You can check out an example article here (I'm into cars btw): &lt;a href="https://www.topmarq.com/forum/how-much-does-a-good-car-wrap-cost-30"&gt;how much does it cost to wrap a car&lt;/a&gt;. This is ok, but I'd like to be able to include additional media like videos, graphics, etc. &lt;/p&gt;

&lt;p&gt;Does anyone have experience in an option like wordpress where each section is defined as a media type? Eg first section is a markdown field with text, then a video field, then another markdown, etc. I'd be interested in hearing how this is structured from a database perspective. &lt;/p&gt;

&lt;p&gt;My thought is that I could remove the individual markdownfield from the article model and replace it with a foreignkey to a 'media' model. Then use that to have separate sections that combine to create the article. &lt;/p&gt;

&lt;p&gt;Would love some feedback on the approach or suggestions!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>django</category>
    </item>
    <item>
      <title>How To Learn Django / Python in a Month</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Tue, 25 Aug 2020 00:46:17 +0000</pubDate>
      <link>https://dev.to/qosha1/how-to-learn-django-python-in-a-month-78k</link>
      <guid>https://dev.to/qosha1/how-to-learn-django-python-in-a-month-78k</guid>
      <description>&lt;p&gt;So quick disclaimer before jumping in. I had some background in coding but never really did it enough to get proficient at it. I learned originally in Java in High School but only played around with it in College for some projects. As such I had a decent understanding of some of the general concepts that might take someone more time to grasp. &lt;/p&gt;

&lt;p&gt;Now, on to the fun stuff. Around march I decided to quit my job (great timing, I know) to try and work on a company idea for a service to find &lt;a href="https://www.topmarq.com/events/"&gt;car shows on weekends&lt;/a&gt;. The problem was, I am an Electrical Engineer and really had never done any web development. &lt;/p&gt;

&lt;p&gt;Well, COVID happened and then Pluralsight offered a deal where April was free for everyone. I decided to take advantage of that by putting all of my time for the entire month into learning a combo of Django, Python and CSS/HTML/JS. &lt;/p&gt;

&lt;p&gt;I started with the intermediate Python course which I really enjoyed. Obviously if you're starting from ground 0 you will need to do the first course also but I thought they were really well done and easy to work along. With this I felt at least semi confident in playing around with basic python.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://app.pluralsight.com/library/courses/python-beyond-basics/table-of-contents"&gt;Beyond the basics&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After that I moved into Django. I started with a good basic course called &lt;a href="https://app.pluralsight.com/library/courses/django-getting-started/table-of-contents"&gt;Django Getting Started&lt;/a&gt;. This was enough to get me going with a basic project and play around with various features. I also used some projects available on the web to play around after taking this course.&lt;/p&gt;

&lt;p&gt;I wanted a bit more understanding of Django so I also took the code school django tutorial. &lt;a href="https://app.pluralsight.com/library/courses/code-school-try-django/table-of-contents"&gt;Try Django from codeschool&lt;/a&gt;. I thought this was ok but definitely less good than the others. I was already somewhat decent though so I fought through it and it definitely filled in a few gaps though so for a short course it's worth it. &lt;/p&gt;

&lt;p&gt;From there my last course was on Bootstrap cause I had no idea what it was or how to use it and i thought this &lt;a href="https://app.pluralsight.com/library/courses/bootstrap-introduction/table-of-contents"&gt;intro&lt;/a&gt; was pretty good. &lt;/p&gt;

&lt;p&gt;Anyways, I was able to do this all free and I did it full time, but I definitely came out of April feeling ready to go. I made tons of mistakes on my first site, but I think you just have to pick a project and go for it so you have a goal. You can check out my site &lt;a href="https://www.topmarq.com"&gt;Topmarq&lt;/a&gt; which is still almost 100% done by me. It may not be the best, but hey I just started!!&lt;/p&gt;

&lt;p&gt;One thing I've really had a tough time with is the blog aspect. I think i should have integrated Wordpress or something but the articles are actually quite difficult to optimize and build according to current standards. For instance, my post about &lt;a href="https://www.topmarq.com/forum/6-great-car-shows-in-houston-that-you-just-can-t-miss-out-on-29"&gt;car shows in Houston&lt;/a&gt; kept having various Title/H1/Meta/Etc tag issues because Django doesn't have a great way of doing this that im aware. Just an FYI if you're looking to create a blog on you Django app, maybe look for a plugin.&lt;/p&gt;

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