[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