2010-04-27 2 views
0

Эй, я делаю всплывающее радиоплеер с прикрепленным видеоокна с django, и у меня проблемы с получением функциональности администратора, которую я хочу.django admin - выбор одной модели для публикации на сайте

У меня есть две модели:

1) Поток (который представляет собой некий поток радио, что администратор может опубликовать, чтобы играть на главной странице - то есть Есть несколько сохраненных потоков, но только один играет на главной странице в то время, по усмотрению администратора)

2) Крик (крик, который был введен в крикбокс и связан с определенным потоком, т. е. каждый поток имеет несколько криков, введенных пользователями сайт.)

Я хочу, чтобы администратор мог войти в задний конец, создать несколько потоков, но на выберите один, который будет опубликован в любой момент времени. Предположительно, каждый поток должен иметь атрибут (i.e is_published), и я должен создать действие администратора для выполнения проверки каждого потока и опубликовать только правильный файл? Правильно ли это, или я что-то упускаю?

ответ

1

Единственная потенциальная проблема, которую я вижу, заключается в том, что если кто-то уже подключился и прослушивает поток до того, как администратор изменит его. Должен ли этот человек слышать новый поток или продолжать слышать поток, который они слушали?

Помимо этого, как вы описали его, я видел, как он работает. Вы можете сделать url/view, который всегда возвращает текущий поток, например /stream/current/. Представление для этого URL всегда будет получить самую последнюю модель Stream ...

def current_stream(request, *args, **kwargs): 
    # Get first stream marked as published 
    s = Stream.objects.filter(is_published=True)[1][0] 
    return do_streaming_stuff(s) 

Потому что вы собираетесь, вероятно, использовать «установить этот поток в качестве активного потока» в другом месте в вашем приложении, вы можете сделать это часть вашей модели потока ...

class Stream(models.Model): 
    is_published = models.BooleanField() 

    def set_as_active_stream(self, do_save=True): 
     enabled_streams = Stream.objects.filter(is_published=True) 
     for s in enabled_streams: 
      s.is_published=False 
      s.save()  
     if do_save: 
      self.is_published=True 
      self.save() 

    def save(self, *args, **kwargs): 
     if self.is_published: 
      # No need to double save, since we're already saving it 
      self.set_as_active_stream(do_save=False) 
     super(Stream, self).save(*args, **kwargs) 
+0

Звучит так же, как и то, что я хочу. Brilliant! На веб-сайте когда-нибудь будет только один поток. Кроме того, каждый поток будет иметь кучу mp3-записей, на которые пользователь может переключиться. Я могу добавить функциональность для ручного переключения между потоками. Я хочу, чтобы администраторы могли публиковать определенный поток, который будет опубликован на сайте, из области администрирования. Должен ли я быть прав, говоря, что мне нужно использовать действия администратора для достижения этого? – pastylegs

+0

Я все еще получаю голову от шаблона MVC и разделения действий базы данных от логики. Я замечаю, что модель имеет функции, которые действуют на себя. Должны ли они быть не во взглядах, а в моделях? – pastylegs

+1

@pasty Django на самом деле MVT, немного отличающийся от MVC. Это, вероятно, несколько предпочтительнее, но я склоняюсь к толстым моделям, тонким взглядам. Я считаю, что здесь меньше дублирования кода. Я уверен, что другие могут сделать хороший аргумент для тонких моделей, толстых представлений. –

Смежные вопросы