Django

Django

Explore django code snippets and tutorials

Django

Generate Django table dynamically

<p>Function to create an html table of a django queryset dynamically.</p>

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
from django.urls import reverse,reverse_lazy, NoReverseMatch, resolve
from django.utils.safestring import mark_safe
from django.db.models.fields.files import ImageFieldFile, FileField
from decimal import Decimal
from django.utils.html import format_html

def get_rows(fields, object_list):
    '''
    fields : [{'verbose_name': 'Name', 'db_name': 'name'}]
    object_list : queryset
    '''
    table = "<table class='table table-striped'>"
    thead = '<thead><tr>'
    for field in fields:
        thead += f"<th>{field['verbose_name']}</th>"
    thead += '</tr></thead>'    
    table += thead + '<tbody>'
    for obj in object_list:
        print(obj._meta.fields)
        app = obj._meta.app_label
        model = obj.__class__.__name__.lower()
        update_url = reverse_lazy(f"{app}:{model}-update",kwargs={"pk":obj.pk})
        delete_url = reverse_lazy(f"{app}:{model}-delete",kwargs={"pk":obj.pk})
        tr = '<tr>'
        for field in fields:
            db_name = field['db_name']
            value = getattr(obj, db_name)
            if isinstance(value, Decimal):
                value = round(value,0)
            elif isinstance(value, bool):
                if value:
                    value = format_html(mark_safe('<i class="bi bi-check-lg text-success"></i>'))
                else:
                    value = format_html(mark_safe('<i class="bi bi-x-lg text-danger"></i>'))
            elif isinstance(value, models.Manager):
                print(f"{value} is a related manager.")
                related_objects = value.get_queryset()
                value = '<ul>'
                for obj in related_objects:
                    value += f'<li>{obj}</li>'
                value += '</ul>'
            elif isinstance(value,ImageFieldFile):
                if value and value.url:
                    value = format_html(mark_safe('<img src="{}" width="100px" />'.format(value.url)))
            tr += '<td>' + str(value) + '</td>'
        tr += f"""<td><a href='{update_url}'>{format_html(mark_safe('<i class="bi bi-pencil-square text-warning" style="font-size:1.5rem;"></i>'))}</a><a href='{delete_url}        'class='delete-tr'>{format_html(mark_safe('<i class="bi bi-x text-danger" style="font-size:1.5rem;"></i>'))}</a></td>"""
        
        tr += '</tr>'
        table += tr
    table += '</tbody></table>'
    return table
Django

Django iterate model object dynamically

<p>This snippet can be used to iterate a model object in django&nbsp; dynamically&nbsp;</p>

python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
def get_obj(obj):
    from django.db import models
    app_label = obj._meta.app_label
    print(app_label)
    fields = obj._meta.get_fields()
    for field in fields:
        if hasattr(obj,field.name):
            value = getattr(obj,field.name)
            if isinstance(field,models.ForeignKey):
                print(field.remote_field.model)
            elif isinstance(value,models.Manager):
                related_objects = value.get_queryset()
                for r_obj in related_objects:
                    print(r_obj)
            else:
                print("name==>",field.name, "value==>",value)
  
my_obj = Model.objects.get(id=1)
get_obj(my_obj)
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
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>