Chained Many To Many Field does not return values

Asked

Viewed 80 times

1

Below is a screenshot of the registration screen where options for choices should appear Ao selecionar Feição deveria aparecer opções nos campos Possíveis Causas e Prováveis consequências

The low image containing the options that should appear in the image above As opções selecionadas deveriam estar presentes na tela anterior

follows the model.py code

from django.contrib.gis.db import models
from djgeojson.fields import PointField
from django.contrib.gis.geos import Point
from django.contrib.gis.geos import GEOSGeometry
from django.contrib.gis.gdal import SpatialReference, CoordTransform
# from bdg import models as bdg_models
from django.contrib.gis.measure import D
import django_tables2 as tables
from sorl.thumbnail import ImageField
from rest_framework import serializers
from smart_selects.db_fields import ChainedManyToManyField
from django.contrib import messages
from django.shortcuts import render
from .thumbs import ImageWithThumbsField
from sorl_thumbnail_serializer.fields import HyperlinkedSorlImageField
from drf_dynamic_fields import DynamicFieldsMixin
from django.core.validators import FileExtensionValidator
import zipfile

class Causa(models.Model):
    nome = models.CharField(max_length=250, null=True, blank=True)

    def __str__(self):
        return self.nome

class Consequencia(models.Model):
    nome = models.CharField(max_length=250, null=True, blank=True)

    def __str__(self):
        return self.nome

class Feicao(models.Model):
    # Opcoes Tipo
    acesso_irregular = "Acesso irregular"
    acumulo_sedimentos_pista = "Acumulo de sedimentos sobre a pista"
    alagamento = "Alagamento"
    assoreamento = "Assoreamento"
    atropelamento_animais_silvestres = "Atropelamento de animais silvestres"
    deslizamento = "Deslizamento"
    erosao = "Erosão "
    estrutura_abandonada = "Estrutura abandonada"
    falta_de_vegetacao = "Falta de vegetação"
    lixo_residuos_solidos = "Lixo e resíduos sólidos"
    ocupacao_irregular = "Ocupação irregular"
    outros = "Outros"
    queda_bloco = "Queda de bloco"
    recalque = "Recalque"

    tipos_opcoes = (
        (acesso_irregular, "Acesso irregular"),
        (acumulo_sedimentos_pista, "Acumulo de sedimentos sobre a pista"),
        (alagamento, "Alagamento"),
        (assoreamento, "Assoreamento"),
        (atropelamento_animais_silvestres, "Atropelamento de animais             silvestres"),
        (deslizamento, "Deslizamento"),
        (erosao, "Erosão "),
        (estrutura_abandonada, "Estrutura abandonada"),
        (falta_de_vegetacao, "Falta de vegetação"),
        (lixo_residuos_solidos, "Lixo e resíduos sólidos"),
        (ocupacao_irregular, "Ocupação irregular"),
        (outros, "Outros"),
        (queda_bloco, "Queda de bloco"),
        (recalque, "Recalque")
    )
nome = models.CharField(max_length=50, choices=tipos_opcoes, blank=True, null=True)
causas = models.ManyToManyField(Causa)
consequencias = models.ManyToManyField(Consequencia)

def __str__(self):
    return self.nome

class Meta:
    verbose_name_plural = "Feições"

class Passivo(models.Model):
# Opcoes relevo
plano = 'PL'
ondulado = 'ON'
montanhoso = 'MO'

relevo_opcoes = (
    (plano, 'Plano'),
    (ondulado, 'Ondulado'),
    (montanhoso, 'Montanhoso')
)

# Opcoes terceira_faixa_localizacao
lado_direito = 'LD'
lado_esquerdo = 'LE'
inexistente = 'IN'
ambos = 'AM'

terceira_faixa_localizacao_opcoes = (
    (lado_direito, 'Lado Direito'),
    (lado_esquerdo, 'Lado Esquerdo'),
    (inexistente, 'Inexistente')
)

#opcoes pavimento
pavimento_asfautico = 'PA'
pavimento_concreto = 'PC'
nao_pavimentado =  'NP'
outro_pavimento = 'OP'
pista_rolamento_pavimento_opcoes = (
    (pavimento_asfautico, 'Pavimento Asfaltico'),
    (pavimento_concreto, 'Pavimento Concreto'),
    (nao_pavimentado,  'Nao Pavimentado'),
    (outro_pavimento, 'Outro Pavimento')
)

# opcoes lado
direito = 'D'
esquerdo = 'E'
indefinido = 'I'
ambos = 'A'

lado_opcoes = (
    (direito, 'Direito'),
    (esquerdo, 'Esquerdo'),
    (indefinido, 'Indefinido'),
    (ambos, 'Lado Direito e Esquerdo')
    )

# Opcoes Perigo
sem_perigo = '0'
perigo_potencial = '1'
perigo_iminente = '2'
perigo_instalado = '3'

nivel_gravidade_escolhas = (
    (sem_perigo, 'Sem Perigo'),
    (perigo_potencial, 'Perigo Potencial'),
    (perigo_iminente, 'Perigo Iminente'),
    (perigo_instalado, 'Perigo Instalado' )
)

# MODELO
data_inspecao = models.DateField('Data de inspeção',auto_now=False)

# LOCALIZAÇÃO
latitude = models.DecimalField('Latitude', max_digits=14, decimal_places=10, blank=False, null=True)
longitude = models.DecimalField('Longitude', max_digits=14, decimal_places=10, blank=False, null=True)
km_ponto = models.DecimalField('Km', blank=True, null=True,max_digits=7, decimal_places=2)
lado = models.CharField('Lado de Ocorrência', blank=True, null=True,max_length=1,choices=lado_opcoes)
distancia_ao_eixo = models.CharField('Distância do Passivo ao Eixo',max_length=50,blank=True, null=True)
area_ocorrencia_faixa_dominio = models.NullBooleanField(blank=True, null=True, default=False)
area_ocorrencia_area_adjacente = models.NullBooleanField(blank=True, null=True, default=False)

# CARACTERIZAÇÃO DO SEGMENTO RODOVIÁRIO
largura_faixa_dominio_esquerda = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
largura_faixa_dominio_direita = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
pista_rolamento_numero = models.IntegerField('nº de pistas de rolamento', blank=True, null=True)
pista_rolamento_pavimento =  models.CharField(max_length=50,
                choices = pista_rolamento_pavimento_opcoes,
                default = pavimento_asfautico)
acostamento_presenca = models.NullBooleanField('Acostamento', default=False)
terceira_faixa_localizacao = models.CharField('Terceira Faixa / Localização', max_length=50,
                   choices = terceira_faixa_localizacao_opcoes,
                   default = inexistente)
relevo = models.CharField(max_length=50,
                   choices = relevo_opcoes,
                   default = plano)

# CARACTERIZAÇÃO DO PASSIVO
# feicao = models.OneToOneField(Feicao, on_delete=models.CASCADE)
feicao = models.ForeignKey(Feicao, on_delete=models.DO_NOTHING)
dimensao_comprimento = models.DecimalField('Comprimento', max_digits=10, decimal_places=2,blank=True, null=True, default = None)
largura_faixa_dominio_total = models.DecimalField('Largura', max_digits=6, decimal_places=2, blank=True, null=True)
dimensao_profundidade = models.DecimalField('Profundidade', max_digits=10, decimal_places=2,blank=True, null=True, default = None)
risco_ao_usuario = models.CharField(max_length=50, choices = nivel_gravidade_escolhas, default = None,  blank=True, null=True)
risco_ao_patrimonio = models.CharField(max_length=50, choices = nivel_gravidade_escolhas, default = None,  blank=True, null=True)
risco_ao_ambiente = models.CharField(max_length=50, choices = nivel_gravidade_escolhas, default = None,  blank=True, null=True)
possiveis_causas = ChainedManyToManyField(
        Causa,
        horizontal=True,
        verbose_name='Possiveis Causas',
        chained_field="feicao",
        chained_model_field="feicao",
        )
provaveis_consequencias = ChainedManyToManyField(
                Consequencia,
                horizontal=True,
                verbose_name = 'Provaveis Consequências',
                chained_field="feicao",
                chained_model_field="feicao",
                )
localizacao = models.PointField(blank=True, null=True)
modelo_3d = models.FileField(upload_to='models/',blank=True, null=True, validators=[FileExtensionValidator(allowed_extensions=['zip'])])
modelo_3d_path =  models.CharField('Endereço do arquivo 3d (cloud.js)',max_length=128,blank=True, null=True)
croqui = models.ImageField('Croqui')
observacoes = models.TextField()
class Meta:
    db_table = 'passivo'





class Foto(models.Model):
descricao = models.CharField('Descrição',max_length=300, blank=True,     null=True, default = None)
image = ImageWithThumbsField(sizes=((100,130),(200,260)))
property = models.OneToOneField(Passivo,
                                related_name='fotos',
                                on_delete=models.CASCADE, null=True)#, default='no-img.png')

class Meta:
    db_table = 'foto'
    verbose_name_plural = "Fotos"

    def __str__(self):
        return ("Fotos do passivo")



class Local(models.Model):
descricao = models.CharField(max_length=55, blank=True, null=True)
fk_passivo_passivo = models.OneToOneField(Passivo,on_delete=models.CASCADE)

class Meta:
    db_table = 'local'

Below follows the admin.py code

from django.contrib import admin
from django.apps import apps
from cadastramento.models import Feicao, Passivo, Causa, Consequencia, Foto
from sorl.thumbnail.admin import AdminImageMixin
import nested_admin
from leaflet.admin import LeafletGeoAdmin

class FotoInline(AdminImageMixin, admin.TabularInline):
model = Foto
extra = 0
class PassivoAdmin(AdminImageMixin,nested_admin.NestedModelAdmin):
model = Passivo
exclude = ['localizacao']


admin.site.register(Causa)
admin.site.register(Consequencia)
admin.site.register(Feicao)
admin.site.register(Passivo,PassivoAdmin)

These options were working, and it stopped working. I can’t remember if I’ve made any changes and you’ve caused this problem and I can’t find what should be done to make it work.

1 answer

0

The problem was with the version used for Django-smart-selects. I was using version 0.24.0 which was updated for some reason that I don’t remember. But the previous version was 0.23.0 and when downgrade again worked.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.