Seite 1 von 1

django admin. dynamische choices

Verfasst: Donnerstag 28. August 2008, 09:54
von nawal
hallo alle,

ich bin neu in phyton und django und habe folgende frage.

wenn ich in einem model einen foreign-key erstelle in etwa so

Code: Alles auswählen

infile = models.ForeignKey(Infile)
habe ich dadurch einen nette select-box im admin bereich zur zuordnung des foreign-keys.

ich möchte gerne eine select-box die aber nicht einem foreign-key zugrunde liegt.

abbilden könnte man das ganze über CHOICES in etwa so

Code: Alles auswählen

FILE_0 = 0
FILE_1 = 1
FILE_2 = 2
FILE_3 = 3
FILE_CHOICES = (
	(FILE_0, 'Datei wählen:'),
	(FILE_1, 'Datei #1'),
	(FILE_2, 'Datei #2'),
	(FILE_3, 'Datei #3'),
)
das feld im model könnte dann so ausssehen

Code: Alles auswählen

infile = models.PositiveIntegerField(choices=FILE_CHOICES)
funktioniert wunderbar, nur ist FILE_CHOICES recht statisch und hier kommt die frage:
wie kann ich die FILE_CHOICES dynamisch füllen, sprich aus einem anderen model holen, zum beispiel aus:

Code: Alles auswählen

class Infile(models.Model):
	VALID_STATUS = 1
	INVALID_STATUS = 2
	STATUS_CHOICES = (
		(VALID_STATUS, 'Valid'),
		(INVALID_STATUS, 'Invalid'),
	)
	filename = models.CharField(max_length=100)
	editor = models.ForeignKey(User)
	edited_at = models.DateTimeField(default=datetime.datetime.now)
	filepath = models.CharField(max_length=250)
	fileext = models.CharField(max_length=3)
	status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES)
	
	def __unicode__(self):
		return self.filename
da ich gerade schon dabei bin. angenommen ich würde doch ForeignKey nutzen, wie könnte ich erreichen, das nur die einträge die status = valid haben zur auswahl kommen?

noch eine frage: im admin bereich werden alle felder die im model definiert werden als required behandelt. wie kann man ein feld als nicht required kennzeichnen?

vielen dank schonmal im vorraus.

Re: django admin. dynamische choices

Verfasst: Donnerstag 28. August 2008, 11:37
von Leonidas
nawal hat geschrieben:noch eine frage: im admin bereich werden alle felder die im model definiert werden als required behandelt. wie kann man ein feld als nicht required kennzeichnen?
``blank=True, null=True`` auf dem Feld definieren.

Verfasst: Donnerstag 28. August 2008, 11:58
von nawal
danke für die schnelle hilfe! damit hat sich der rest auch erledigt.
nur eins bleibt noch offen:
wie kann man den ForeignKey so filtern, dass nur die status=valid zur auswhl stehen.

Verfasst: Samstag 30. August 2008, 09:24
von sma
Mir ist nicht ganz klar, warum man bei einer Relation die Konsistenz riskieren will, indem man die Auswahlliste manuell zusammenstellt, aber um das Admin-UI an dieser Stelle zu ändern, kann man sich z.B. dieses Snippet anschauen. Es zeigt, wie man ein eigenes Widget einbringen kann. Statt des Beispiels mit einem Link, muss es in diesem Fall natürlich eine Auswahlliste mit den Werten sein. Diese kann man zu dem Zeitpunkt dann auch beliebig zusammenstellen.

Oder reicht einfach die Möglichkeit, die Auswahlliste einzuschränken?

Stefan