2015-01-16 2 views
1

У меня есть простая модель, чтобы показать компании Время работыDjango пользовательских методы в шаблонах и DB запросы

class Company(Model): 
    class Meta: 
     verbose_name = _(u"Empresa") 
     verbose_name_plural = _(u"Empresas") 
     ordering = ('published_dt',) 

    user = ForeignKey('auth.User', verbose_name=_(u"Responsável"), null=True, blank=True) 
    category = ForeignKey(CompanyCategory, verbose_name=_(u"Categoria"), help_text=_(u"Categoria que a empresa faz parte. Eg:. Alimentação, Pet Shop"), null=True, blank=True) 

    # Company Fields 
    title = CharField(max_length=150, verbose_name=_(u"Nome da Empresa"), null=True, blank=True) 
    slogan = CharField(max_length=150, verbose_name=_(u"Slogan"), help_text=_(u"Um slogan ou descrição curta. Ex:. 'Compramos sua moto e pagamos á vista'"), null=True, blank=True) 
    image = ImageField(blank=True, null=True, upload_to='uploaded_images') 
    crop = CharField(choices=CROP, max_length=200, null=True, blank=True, verbose_name=_(u"Cortar Imagem"), help_text=_(u"Selecione o ponto de referência para cortarmos a imagem.")) 
    email = EmailField(max_length=200, verbose_name=_(u"Email"), null=True, blank=True) 
    website = URLField(max_length=200, verbose_name=_(u"Website"), null=True, blank=True) 
    published = BooleanField(default=True, verbose_name=_(u"Publicado")) 
    published_dt = DateTimeField(null=True, blank=True, default=datetime.now(), help_text=_(u"Date of publication - Not necessary to complete if you do not know what it is."), verbose_name=_(u"Published Date")) 
    description = HTMLField(null=True, blank=True, verbose_name=_(u"Descrição"), help_text=_(u"Uma descrição da sua empresa em poucas linhas.")) 

    enable_comments = BooleanField(default=True, verbose_name=_(u"Habilitar Comentários")) 
    # Admin fields 
    slug = SlugField(verbose_name=_(u'Slug/URL'), blank=True, null=True, max_length=300,) 
    order = PositiveIntegerField(verbose_name=_(u"Ordem"), null=True, blank=True) 

    def __unicode__(self): 
     return u'%s' % self.title 

    def get_address(self): 
     if self.address and self.city and self.number and self.uf: 
      return u'%s, %s - %s, %s' % (self.address, self.number, self.city, self.uf) 

    def get_absolute_url(self): 
     code = codifica(self.pk) 
     return reverse('website:company_detail', kwargs={'slug':self.slug, 'pk':self.pk}) 

class OpeningHours(Model): 
    class Meta: 
     verbose_name = _(u"Horário de Abertura") 
     verbose_name_plural = _(u"Horários de Abertura") 
     unique_together = ('company', 'weekday') 

    company = ForeignKey(Company, related_name="opening_times", verbose_name=_(u"Empresa")) 
    weekday = IntegerField(choices=WEEKDAYS, verbose_name=_(u"Dia da Semana")) 
    fromHour = TimeField(verbose_name=_(u"Abre ás:"), null=True, blank=True) 
    toHour = TimeField(verbose_name=_(u"Fecha ás:"), null=True, blank=True) 

    def __unicode__(self): 
     return "%s %s (%s - %s)" % (self.company, self.weekday, self.fromHour, self.toHour) 

И мне нужен способ, чтобы иметь что-то вроде {{ company.is_open }} на шаблоне, и Company.objects.all().order_by('open'). Как я могу это сделать, используя мою структуру?

ответ

2

Добавить метод компании:

import datetime 

... 

class Company(Model): 

    ... 

    def is_open(self): 
     today_hours = self.opening_times.filter(weekday=datetime.datetime.today().weekday())[0] # you may want to add code to make sure that there is an entry for this weekday 
     if datetime.datetime.now().time() > today_hours.fromHour and datetime.datetime.now().time() < today_hours.toHour: 
      return True 
     else: 
      return False 

Вы тогда сможете вызвать используя {{ company.is_open }} в шаблонах.

К сожалению, вы не сможете запросить об этом или заказать его в своих вызовах по базе данных. Тем не менее, вы можете отсортировать его после того, как запрос делается:

companies = sorted(Company.objects.all(), key=lambda c: c.is_open(), reverse=True) 
+0

Похоже, это сравнение не очень хорошо работает «, если datetime.datetime.now()> today_hours.fromHour и datetime.datetime.now()

+1

Изменена эта строка для добавления .time(). Попробуй это сейчас? У вас могут быть проблемы с часовым поясом. –

+0

Работал как шарм. Я использую «food_companies = sorted (Company.objects.filter (category__where_eat = True) [0: 5], key = lambda c: c.show_open())« просто так, но он упорядочивает обратный. –

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