Dive into Code

Discover code snippets, tutorials, and programming insights

Django

Django models for storing web scrapper data

<ul> <li> <p><code>Element</code>:</p> <ul> <li>Represents an HTML element.</li> <li>It has a <code>name</code> field, which is a character field with a maximum length of 200.</li> <li>Inherits from the <code>Timestamped</code> model (which …

python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from django.db import models

# Create your models here.

class Timestamped(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Element(Timestamped):
    name = models.CharField(max_length=200)

    class Meta:
        default_related_name = 'elements'
        verbose_name = 'element'
        verbose_name_plural = 'elements'

    def __str__(self):
        return self.name
    

class Domain(Timestamped):
    name = models.CharField(max_length=200)

    class Meta:
        default_related_name = 'domains'
        verbose_name = 'domain'
        verbose_name_plural = 'domains'

    def __str__(self):
        return self.name



class Page(Timestamped):
    url = models.URLField(max_length=2048)
    domain = models.ForeignKey("Domain", on_delete=models.CASCADE)
    pages = models.ManyToManyField("self",symmetrical=False,related_name='children')
    response = models.TextField(null=True,blank=True)
    elements = models.ManyToManyField("Element",through="PageElement")


    class Meta:
        default_related_name = 'pages'
        verbose_name = 'page'
        verbose_name_plural = 'page'

    def __str__(self):
        return self.url
    

class PageElement(Timestamped):
    page = models.ForeignKey("Page", on_delete=models.CASCADE)
    element = models.ForeignKey("Element", on_delete=models.CASCADE)
    value = models.TextField(null=True,blank=True)


    

class Attribute(Timestamped):
    element = models.ForeignKey("Element", on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    value = models.TextField(null=True,blank=True)


    class Meta:
        default_related_name = 'attributes'
        verbose_name = 'attribute'
        verbose_name_plural = 'attributes'

    def __str__(self):
        return self.name
jQuery

submit form with jquery ajax

javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$('body').on('submit', 'form', function(e){
            e.preventDefault();
            let $form = $(this);
            let url = $(this).attr('action');
            let data = $(this).serialize();
            let method = $(this).attr('method');
            $.when($.ajax({
                url: url,
                data:data,
                method:  method,
                datatype: 'json',
              })).then(function( response, textStatus, jqXHR ) {
              console.info(response);
              $($form)[0].reset();
              var obj = response;
              console.info(obj)
              
            }).catch(function(err){
              $.each(err.responseJSON, function(index, value){
                console.info(index, value);
                $('#id_'+ index).addClass('is-invalid');
                $('#id_'+ index).after("<div class='invalid-feedback'>" + value + "</div>");
            });
            return false
        })
Django

Django split model form fields into bootstrap rows

<p>Django doesn&#39;t provide a built-in way to split a ModelForm&#39;s fields into multiple rows by default. However, you can achieve this by customizing the rendering of the form in the …

python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
template tag 

from django import template
register = template.Library()


@register.inclusion_tag("custom_form.html")
def generate_form(form):
    return {"form": form}





<!-- templates/myapp/custom_form_template.html -->
{% for hidden in form.hidden_fields %}
  {{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
        <div class="col">
            <label for="{{field.id_for_label}}" class="form-label">{{field.label}}</label>
            {{field}}
            <div class="invalid-feedback">
                {{field.errors}}
            </div>
            {% if field.help_text %}
                <p class="help">{{ field.help_text|safe }}</p>
            {% endif %}
        </div>
        {% if forloop.counter0|divisibleby:3 %}
        {# Start new row #}
        </div>
        <div class="row g-3">
        {% endif %}
{% endfor %}
<div class="row py-2">
  <div class="d-grid gap-2 d-md-flex justify-content-md-end">
    <a href="{{back_url}}" class="btn btn-link">Back</a>
  <button type="submit" name="button" class="btn btn-primary">Save</button>
</div>
</div>