[Python] Aiuto con Django, interfaccia amministrativa e relazioni fra i modelli

germano carella germano.carella a gmail.com
Mer 8 Ago 2018 19:18:39 CEST


Salve a  tutti ragazzi, come va?

Dopo un lunghissimo periodo di assenza, sono tornato, con altri problemi.

Sta volta sto studiando Django. Ho lasciato perdere Drupal, perché i 
suoi progetti purtroppo sono farraginosi, a volte non si capisce bene 
cosa puoi fare e cosa non puoi.

Comunque, voglio costruire un sito web con Django, ma prima di farlo sto 
sperimentando in locale un po' di tecniche e, soprattutto, sto imparando.

Ho già creato un piccolo blog, seguendo un bel tutorial ed 
effettivamente non è stato difficile.

Ora però ho provato a creare dei modelli con delle relazioni fra di loro 
ed ho un problema: in realtà è risolvibile, ma vorrei capire se c'è modo 
di fare quello che interessa a me, vado a spiegarmi.


Ho tre modelli, Artist, Album e Song, di cui posterò tutto il codice in 
questo messaggio.

Per didattica, Artist non ha alcun tipo di relazione, quindi viene 
creato semplicemente digitando il nome e una breve BIO facoltativa.

Album e Song invece hanno due tipi di relazione: Album ha una relazione 
many-to-many con Song e Song ha una relazione One-to-one con Album

Quindi, ogni album ha tante song, ogni song appartiene ad un album.

Considerando che ho lasciato l'interfaccia di amministrazione così come 
la presenta il sistema, ho soltanto registrato i modelli in admin.py 
della mia app singers, così li posso vedere nell'interfaccia.

Quando aggiungo un artista nessun problema, lo aggiungo, lo salvo, tutto ok.

I problemi però sorgono quando inizio ad aggiungere un album: l'artista 
è stato già aggiunto in precedenza, quindi lo posso selezionare dalla 
casella relativa agli artisti del modello album.

Dallo stesso form, posso cliccare su Add per aggiungere canzoni, ma qui 
mi blocco, perché il campo ForeignKey di canzoni, che si riferisce 
all'album, non può essere selezionato finché l'album non viene salvato.

Fra l'altro è un campo richiesto, quindi, se non lo compilo, django non 
mi salva la song.

Parimenti, se decidessi di non renderlo obbligatorio (blank=True), ogni 
volta che aggiungo un album e le sue canzoni, dovrei andare canzone per 
canzone e dirgli a che album appartiene... Brutto!


Vi posto il codice di models.py. Attenzione, ho indentato con un solo 
spazio, non mi picchiate, lo sto scrivendo con notepad!


Naturalmente tutto è perfettibile, ho da studiare ancora, magari la 
soluzione è banale e io mi sono solo perso, non lo so.


# models.py

from django.db import models

class Artist(models.Model):
  name = models.CharField(max_length=60)
  bio= models.TextField(blank=True)
  def publish(self):
   self.save()
  def __str__(self):
   return self.name

class Song(models.Model):
  album_title = models.ForeignKey('Album',on_delete=models.CASCADE)
  tracknumber = models.IntegerField(primary_key=True)
  tracktitle = models.CharField(max_length=250)
  def publish(self):
   self.save()
  def __str__(self):
   return str(self.tracknumber)+" - "+self.tracktitle


class Album(models.Model):
  title = models.CharField(max_length=250)
  artist = models.ForeignKey(Artist,on_delete = models.CASCADE)
  notes = models.TextField(blank=True)
  tracks = models.ManyToManyField(Song)
  def publish(self):
   self.save()
  def __str__(self):
   return self.title+" di "+self.artist


Il metodo publish non serve a niente, lo posso anche togliere.

Se qualcuno mi dà una mano, o qualcosa da leggere, gliene sarò grato!

Germano



Maggiori informazioni sulla lista Python