Package: django-ads
a Django Application to make it easy to add Simple (Image) Advertisements to your project.Each Ad has atitle, aURLto redirect to, animageto be displayed in the template as a link, astart & end dates, and aweightrelative to other Ads in the same zone. The higher the weight, the more frequently the Ad will be displayed.Each time an Ad is displayed anImpressionwill be saved to the database about it with session id and source ip address, and each time it will be clicked aclickwill be saved in the database about it with the same info.Installation:Install the package using pip:pipinstalldjango-adsRun django Migration to add tables to your database:pythonmanage.pymigrateadsConfiguration:Add'ads'to yourINSTALLED_APPSMake suredjango.template.context_processors.requestis included incontext_processorsTEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[],'APP_DIRS':True,'OPTIONS':{'context_processors':[...'django.template.context_processors.request',...],},},]Make suredjango.contrib.sessions.middleware.SessionMiddlewareis included toMIDDLEWARE_CLASSES/MIDDLEWAREPrior to Django 1.10MIDDLEWARE_CLASSES=[...'django.contrib.sessions.middleware.SessionMiddleware',...]Django 1.10 (new style)MIDDLEWARE=[...'django.contrib.sessions.middleware.SessionMiddleware',...]Add the following to your settings file:ADS_GOOGLE_ADSENSE_CLIENT=None# 'ca-pub-xxxxxxxxxxxxxxxx'ADS_ZONES={'header':{'name':gettext('Header'),'ad_size':{'xs':'720x150','sm':'800x90','md':'800x90','lg':'800x90','xl':'800x90'},'google_adsense_slot':None,# 'xxxxxxxxx','google_adsense_format':None,# 'auto'},'content':{'name':gettext('Content'),'ad_size':{'xs':'720x150','sm':'800x90','md':'800x90','lg':'800x90','xl':'800x90'},'google_adsense_slot':None,# 'xxxxxxxxx','google_adsense_format':None,# 'auto'},'sidebar':{'name':gettext('Sidebar'),'ad_size':{'xs':'720x150','sm':'800x90','md':'800x90','lg':'800x90','xl':'800x90'}}}ADS_DEFAULT_AD_SIZE='720x150'ADS_DEVICES=(('xs',_('Extra small devices')),('sm',_('Small devices')),('md',_('Medium devices (Tablets)')),('lg',_('Large devices (Desktops)')),('xl',_('Extra large devices (Large Desktops)')),)ADS_VIEWPORTS={'xs':'d-block img-fluid d-sm-none','sm':'d-none img-fluid d-sm-block d-md-none','md':'d-none img-fluid d-md-block d-lg-none','lg':'d-none img-fluid d-lg-block d-xl-none','xl':'d-none img-fluid d-xl-block',}Where each element inADS_ZONESdefines azonethat can be used in your templates to display ads. Each zone must have a name to be used in the admin interface when adding ads, and sizes to be used to display the ad images in templates.This app has one template:ads/tags/render_ads_zone.html. It makes some assumptions:Your project uses Bootstrap (thevisible-*andimg-responsiveCSS classes are used).If you are using Google AdSense‎, it is assumed that you have'sekizai'in yourINSTALLED_APPSand that your base template contains{% render_block "js" %}.If either of the above assumptions will cause a problem in your project, feel free to override the template.Create a URL pattern in your urls.py:fromdjango.conf.urlsimportinclude,urlurlpatterns=[...url(r'^ads/',include('ads.urls')),...]Usage:Add Advertisers, Categories, and Ads using Django admin interface.loadads_tagsin your template:{%loadads_tags%}userender_ads_zonein your template where you want your ads to appear:{%render_ads_zone'zone_name'%}useget_ads_countin your template to check if any zone has active ads.{%get_ads_count'zone1'asads_count%}{{get_ads_count'zone1,zone2,zone3'asads_count%}Changelog:1.1.1 (2020-03-20):remove @python_2_unicode_compatible (removed in Django 3.0)1.1.0 (2019-07-28):get_ads_count template tag added.fixed setup dependency (django-js-reverse has been added).1.0.0 (2019-03-26):major change in functionality (switch to JS approach in rendering templates). You need jquery to be installed in frontend to use django-ads.Note: templates/ads/tags/render_ads_zone.html has been changed. If you use a custom template, then please take a look at the new version.0.2.1 (2018-07-26): (Special Thanks to@GabrielDumbrava)get_zones_choices now return choices sorted based on keyAd, Category, and Advertizer now stay on DB after deletingcreated_byuser.fix get_absolute_url in Ad model.Addadandad__zonefilters to impressions and clicks admin pages.Fix clicks and impressions admin search.0.2.1 (2018-02-05):add long_description to setup.py0.2.0 (2018-02-05): (Special Thanks to@ataylor32)add Django 2.0 supportadd missing dependency (Pillow)update README0.1.8 (2017-06-24):fix googleads script tags to load multiple ad units in the same page0.1.7 (2017-06-24):Please do not use this version0.1.6 (2017-06-24):fix django-sekizai dependency version0.1.5 (2017-06-24):add google adsense fallback0.1.4 (2017-03-01):get client ip address from HTTP_X_FORWARDED_FOR if it exists.0.1.3 (2017-02-08):remove dependency on easy-thumbnails.add Image validation to validate image size on upload using Admin interface.0.1.2 (2017-02-08):add AdImage model to allow responsive ads.0.1.1 (2016-12-20):add missing templates directory.