Администратор django - выбор одной модели для публикации на сайте - PullRequest
0 голосов
/ 27 апреля 2010

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

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

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

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

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

1 Ответ

1 голос
/ 27 апреля 2010

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

Кроме того, как вы описали это, я мог видеть, как это работает. Вы можете создать URL / представление, которое всегда возвращает текущий поток, например /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)

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

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)
...