πŸ”₯ ΠžΠ±Π·ΠΎΡ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° поля массива Django: особСнности ΠΈ использованиС

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивовыми полями Π² Django Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ArrayField.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ArrayField Π² Ρ„ΠΎΡ€ΠΌΠ΅ Django:


from django import forms
from django.contrib.postgres.forms import SimpleArrayField

class MyForm(forms.Form):
    my_array = forms.CharField(widget=SimpleArrayField(forms.IntegerField()))
    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм Ρ„ΠΎΡ€ΠΌΡƒ с ΠΏΠΎΠ»Π΅ΠΌ "my_array", ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ массив Ρ†Π΅Π»Ρ‹Ρ… чисСл.

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ArrayField Π² модСлях Django. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


from django.db import models
from django.contrib.postgres.fields import ArrayField

class MyModel(models.Model):
    my_array = ArrayField(models.IntegerField())
    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм модСль "MyModel" с ΠΏΠΎΠ»Π΅ΠΌ "my_array", ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ массив Ρ†Π΅Π»Ρ‹Ρ… чисСл.

НадСюсь, это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с массивовыми полями Π² Django!

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΌΠΈΡ€ Django: Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ для массивных ΠΏΠΎΠ»Π΅ΠΉ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ, ΡƒΡ‡Π΅Π½ΠΈΠΊ! МнС ΠΎΡ‡Π΅Π½ΡŒ приятно, Ρ‡Ρ‚ΠΎ Ρ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΠ΅ΡˆΡŒΡΡ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ для массивных ΠΏΠΎΠ»Π΅ΠΉ Π² Django. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этой Ρ‚Π΅ΠΌΠ΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΈ рассмотрим нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠ΄Π°.

Но ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ, Π΄Π°Π²Π°ΠΉ я расскаТу Ρ‚Π΅Π±Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ Django ΠΈ массивных полях.

ВступлСниС Π² ΠΌΠΈΡ€ Django

Django - это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° языкС Python. Он ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ мноТСство инструмСнтов ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ процСсс Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ быстрым ΠΈ эффСктивным. Одной ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… возмоТностСй ΡΠ²Π»ΡΡŽΡ‚ΡΡ массивныС поля.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ массивныС поля Π² Django?

ΠœΠ°ΡΡΠΈΠ²Π½Ρ‹Π΅ поля Π² Django ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΠ»Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, список Ρ‚Π΅Π³ΠΎΠ², Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

Когда Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ массивноС ΠΏΠΎΠ»Π΅ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ Django, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ элСмСнтов массива (CharField, IntegerField ΠΈ Ρ‚.Π΄.), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для отобраТСния этого поля Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅.

Π Π°Π±ΠΎΡ‚Π° с Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ для массивных ΠΏΠΎΠ»Π΅ΠΉ

Π’ Django сущСствуСт нСсколько Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для отобраТСния массивных ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅. Π”Π°Π²Π°ΠΉ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ….

1. MultiValueField ΠΈ MultiWidget

MultiValueField ΠΈ MultiWidget - это классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ собствСнный Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ для отобраТСния массивного поля. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой собствСнный Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ ΠΎΡ‚ MultiWidget, ΠΈ своС собствСнноС ΠΏΠΎΠ»Π΅, ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ ΠΎΡ‚ MultiValueField.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

from django import forms

class TagWidget(forms.MultiWidget):
    def __init__(self, attrs=None):
        widgets = (
            forms.TextInput(),
            forms.TextInput(),
            forms.TextInput(),
        )
        super().__init__(widgets, attrs)

    def decompress(self, value):
        if value:
            return value
        return ['', '', '']

    def format_output(self, rendered_widgets):
        return '<div class="tag-widget">' + ''.join(rendered_widgets) + '</div>'

class TagField(forms.MultiValueField):
    def __init__(self, *args, **kwargs):
        fields = (
            forms.CharField(),
            forms.CharField(),
            forms.CharField(),
        )
        super().__init__(fields, *args, **kwargs)

    def compress(self, values):
        return values

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ создали собствСнный Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ TagWidget, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… тСкстовых ΠΏΠΎΠ»Π΅ΠΉ, ΠΈ ΠΏΠΎΠ»Π΅ TagField, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ для отобраТСния поля Π² Ρ„ΠΎΡ€ΠΌΠ΅.

2. ArrayField ΠΈ SelectMultiple

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ массивноС ΠΏΠΎΠ»Π΅ ΠΊΠ°ΠΊ список ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… элСмСнтов, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ArrayField ΠΈ SelectMultiple.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

from django import forms

class TagForm(forms.Form):
    tags = forms.MultipleChoiceField(
        widget=forms.SelectMultiple,
        choices=[('tag1', 'Tag 1'), ('tag2', 'Tag 2'), ('tag3', 'Tag 3')]
    )

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создали класс Ρ„ΠΎΡ€ΠΌΡ‹ TagForm, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ»Π΅ tags, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SelectMultiple. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ элСмСнт Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Π² Π²ΠΈΠ΄Π΅ списка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ тСбя Π΅ΡΡ‚ΡŒ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ для массивных ΠΏΠΎΠ»Π΅ΠΉ Π² Django. Помни, Ρ‡Ρ‚ΠΎ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСбольшая Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Django. Если тСбя заинтСрСсовало это, я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ дальшС ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Django ΠΈ Π΅Π³ΠΎ возмоТности.

Π–Π΅Π»Π°ΡŽ Ρ‚Π΅Π±Π΅ успСхов Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ Django ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ!

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Django : Django admin custom ArrayField widget

Django : Better ArrayField admin widget?

How to Easily Style Your Django Form Fields With Django Widget Tweaks

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ pip django cleanup для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

πŸ”₯ ΠžΠ±Π·ΠΎΡ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° поля массива Django: особСнности ΠΈ использованиС

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ³ΠΎ Viberbot Π½Π° Django 2 ΠΈ Viber REST API: Π§Π°ΡΡ‚ΡŒ Ρ‚Ρ€Π΅Ρ‚ΡŒΡ - Message