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']
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 (ʘ‿ʘ)
@xaoc: nie bardzo rozumiem sens istnienia modelu Page. Co do sliderow, uzyj many-to-one. Slider nie musi byc many to many, bo do jednego posta/strony jest chyba jeden slider?
@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.
@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
@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
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ą.
@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.
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
źródło: comment_QZpspL8xBJ67HVg5Whiq0rylS5Ll7w6T.jpg
Pobierz@morsik: Racja
@galatian: Proszę bardzo!
Relacje many to many masz np. w implementacji tagow na blogu, gdzie jeden post moze miec
źródło: comment_7cpCuiRQDZ4y2QGCbFuSQpSrui08bjZ1.jpg
PobierzI 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ą.