class Abc(models.Model): ....krotkanazwa = models.TextField() ....dluganazwa = models.CharField()
to jak w drugim mogę zrobić listę wyboru z Abc w formie krótkanazwa: dluganazwa inaczej jak tworząc to np na sztywno przez tuple?
w tupli np mam wartości TUPLA = (('m', 'm : mama'), ('t', 't : tata'))
i kod drugiego modelu
class Efg(models.Model): ....wybierztyp = models.CharField(choices=TUPLA)
wtedy mam rozwijaną listę z m: mama t: tata
tyle, że jak chcę coś dodać to muszę w tupli dorzucić to w kodzie, a chciałbym tak zrobić, żeby przez admin panel dodając w modelu Abc np krotkanazwa "d", a dluganazwa "dziadek", w polu z rozwijaną listą w Efg wybierztyp pojawiały się dodane wartości jako d: dziadek itd
@Cnrash3: atrybut choices został stworzony wyłącznie dla celów formularzy i rzeczywiście dotyczy statycznych wartości (lista, tupla). Możesz stworzyć własne pole dziedzicząc po CharField i przysłaniając metodę get_choices... tylko to gra nie warta świeczki. Stwórz ModelForm i użyj https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield z argumentem queryset= Abc.objects.all()
@Cnrash3: tak nawiasem - nie możesz po prostu stworzyć relacji wiele-do-jednego pomiędzy Efg a Abc? Wygląda to na klasyczny przypadek, chyba, że czegoś nie przedstawiłeś w przykładzie. Relację określasz po stronie wiele, więc w modelu Abc tworzysz pole reprezentujące relację, np. tak: class Abc(models.Model): ____efg_type = models.ForeignKey(Efg)
I wtedy Django robi wszystko za Ciebie (jeśli korzystasz z generic views to masz od razu wszystko w kontekście, więc 0 pracy z tworzeniem
@gofr: Zrobiłem to przez ForeignKey i działa. Dzięki. Teraz tylko nie wiem jeszcze jak zrobić żeby w template pokazywało samo krotkanazwa czyli np M, a w panelu admina na liście dodanych M: Mama
raczej przez to że w Abc mam def str(self): ....return self.krotkanazwa + ': ' + self.dluganazwa
da się jakoś oddzielić __str_dla admina i to co później idzie dla template?
@Cnrash3: nie jestem pewien, czy rozumiem Twoje pytanie. Chcesz renderować inną wartość tekstową dla instancji klasy Abc po stronie szablonu i panelu admina? Jeśli tak: To jak będziesz renderował dane po stronie template to whatever - jeżeli nie chcesz się odwoływać przez {{obiektabc.krotka_nazwa}} {{obiektabc.dluga_nazwa}} to zrob sobie property na modelu Abc np. @property def nazwa(self): ___return u'{} {}'.format(self.krotka_nazwa, self.dluga_nazwa) i odwołuj się po {{obiektabc.nazwa}} A metodę _
Jeśli mam model
class Abc(models.Model):
....krotkanazwa = models.TextField()
....dluganazwa = models.CharField()
to jak w drugim mogę zrobić listę wyboru z Abc w formie krótkanazwa: dluganazwa inaczej jak tworząc to np na sztywno przez tuple?
w tupli np mam wartości
TUPLA = (('m', 'm : mama'), ('t', 't : tata'))
i kod drugiego modelu
class Efg(models.Model):
....wybierztyp = models.CharField(choices=TUPLA)
wtedy mam rozwijaną listę z
m: mama
t: tata
tyle, że jak chcę coś dodać to muszę w tupli dorzucić to w kodzie, a chciałbym tak zrobić, żeby przez admin panel dodając w modelu Abc np krotkanazwa "d", a dluganazwa "dziadek", w polu z rozwijaną listą w Efg wybierztyp pojawiały się dodane wartości jako d: dziadek itd
class Abc(models.Model):
____efg_type = models.ForeignKey(Efg)
I wtedy Django robi wszystko za Ciebie (jeśli korzystasz z generic views to masz od razu wszystko w kontekście, więc 0 pracy z tworzeniem
Teraz tylko nie wiem jeszcze jak zrobić żeby w template pokazywało samo krotkanazwa czyli np M, a w panelu admina na liście dodanych M: Mama
raczej przez to że w Abc mam
def str(self):
....return self.krotkanazwa + ': ' + self.dluganazwa
da się jakoś oddzielić __str_dla admina i to co później idzie dla template?
ForeignKey bierze obie wartości czyli
To jak będziesz renderował dane po stronie template to whatever - jeżeli nie chcesz się odwoływać przez {{obiektabc.krotka_nazwa}} {{obiektabc.dluga_nazwa}} to zrob sobie property na modelu Abc np.
@property
def nazwa(self):
___return u'{} {}'.format(self.krotka_nazwa, self.dluga_nazwa)
i odwołuj się po {{obiektabc.nazwa}}
A metodę _