Wpis z mikrobloga

#program #django #python

Witajcie uczę się django i chciałem zrobić appkę Page. Ma ona za zadanie wyświetlać strony każda ze stron składać się będzie z części oraz może zawierać slider. Ale jeden slider może należeć do wielu stron.

#models
class Page(models.Model):
. publish = models.BooleanField('Publikować?', default=True)
. title = models.CharField('Tytuł', max_length=64)

#wspomniany slider
class CarouselSlide(models.Model):
. title = models.CharField('Tytuł', max_length=50)
. body = models.TextField('Treść', max_length=500)
. image = models.FileField('Zdjęcie w tle')
. page = models.ManyToManyField(Page, blank=True)

#poszczegolne czesci strony
class Post(models.Model):
. page = models.ForeignKey(Page, on_delete=models.CASCADE, blank=True)
. publish = models.BooleanField('Publikować?', default=True)
. title = models.CharField('Tytuł', max_length=255)
. body = models.TextField('Treść', blank=True)
. image = models.FileField('Zdjęcie obok', blank=True)

I teraz w admin.py chciałbym zrobić coś takiego z sliderm jak zrobiłem z postem (tylko post jest ManyToOneField a slider jest ManyToManyField). generalnie wyświetlają się slidery, które zostały dodane oraz mogę dodać nowy. Może też być opcja, że slidery tworzę osobno a w Django admin tylko sobie wybieram które.

#admin
class PostInLIne(admin.StackedInline):
. model = Post
. extra = 1
. fields = [('title', 'publish'), 'body', 'image']

class PageAdmin(admin.ModelAdmin):
. fields = [('icon', 'title', 'publish'), 'right_bar']
. exclude = []
. inlines = [PostInLIne]

admin.site.register(Page, PageAdmin)

Tak to wygląda z Post i chciałbym, żeby podobie z sliderami
xaoc - #program #django #python


Witajcie uczę się django i chciałem zrobić appkę...

źródło: comment_QZpspL8xBJ67HVg5Whiq0rylS5Ll7w6T.jpg

Pobierz
  • 8
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

zawsze mnie zastanawiało dlaczego wg PEP8 trzeba dawać spację po # w komentarzu, znalazłem pierwszy realny powód- nie tagowałoby przy wklejaniu kodu (ʘʘ)
  • Odpowiedz
@zefj: Nie tworzę sobie kilka sliderów. Każdy może być wyświetlony na wielu stronach. Np jest promocja i chcę żeby pewna informacja się pojawiła na każdej. Są też strony na których ma go nie być. Many-to-one umiem obsłużyć bo był w tutorialu wszystkie filmiki na yt też się zatrzymują na tym.

@morsik: Racja

@galatian: Proszę bardzo!
  • Odpowiedz
@xaoc: Jesli kazda strona ma miec maksymalnie jeden slider, to musisz stworzyc relacje many to one, a nie many to many. Nic nie stoi na przeszkodzie, zeby taki sam slider pojawil sie na kilku stronach - pole ForeignKey w modelu Page, i w edycji strony mozesz do niej przypisac jeden z wczesniej stworzonych sliderow.

Relacje many to many masz np. w implementacji tagow na blogu, gdzie jeden post moze miec
  • Odpowiedz
@xaoc: a jesli chcesz, by jedna strona mogla miec kilka sliderow, to pole ManyToManyField daj w Page, a nie w CarouselSlider. Ponizej masz screen z djangoadmin (edycja posta), najpierw widget do ManyToManyField (wiele tagow do wielu postow), a nizej do ForeignKey (wiele postow do jednego projektu). Czyli jesli chcesz cos podobnego u ciebie, to pole relacji powinno byc w modelu Page. Jaka relacje zrobisz zalezy od tego jak ta funkcjonalnosc
zefj - @xaoc: a jesli chcesz, by jedna strona mogla miec kilka sliderow, to pole Many...

źródło: comment_7cpCuiRQDZ4y2QGCbFuSQpSrui08bjZ1.jpg

Pobierz
  • Odpowiedz
@zefj: Dzięki. Działa.

I nasze niezrozumienie (twoja sugestia, że jest to relacja wiele do jednego) wynikało z tego że mówiąc slider miałem na myśli tak naprawdę jeden slajd z niego. I mam 10 takich slajdów i decyduję, które na której stronie się wyświetlają.
  • Odpowiedz
@xaoc: No wlasnie cos mi tu nie pasowalo, bo od poczatku wszystko nazywales sliderem, gdy chodzilo ci o pojedynczy slajd, i odwrotnie. W sumie dopiero teraz do mnie dotarlo, ze probujesz zrobic carousel slider, ktory z zalozenia ma wiecej niz jeden "slajd", i teraz ma to sens - wiele slajdow do wielu stron.
  • Odpowiedz