A django application that tries to eliminate annoying things in the Django framework. ⛺
BSD-3-CLAUSE License
This django application eliminates certain annoyances in the Django framework.
this
) if the object is not found.annoying
directory to your django project or put in on your PYTHONPATH.python setup.py install
, easy_install django-annoying
,pip install django-annoying
."annoying"
under INSTALLED_APPS in your settings.py
file.from annoying.decorators import render_to
# 1. Template name in decorator parameters
@render_to('template.html')
def foo(request):
bar = Bar.object.all()
return {'bar': bar}
# equals to
def foo(request):
bar = Bar.object.all()
return render(request, 'template.html', {'bar': bar})
# 2. Template name as TEMPLATE item value in return dictionary
@render_to()
def foo(request, category):
template_name = '%s.html' % category
return {'bar': bar, 'TEMPLATE': template_name}
#equals to
def foo(request, category):
template_name = '%s.html' % category
return render(request, template_name, {'bar': bar})
Note: signals
is deprecated and will be removed in a future version. Django now includes this by default.
from annoying.decorators import signals
# connect to registered signal
@signals.post_save(sender=YourModel)
def sighandler(instance, **kwargs):
pass
# connect to any signal
signals.register_signal(siginstance, signame) # and then as in example above
#or
@signals(siginstance, sender=YourModel)
def sighandler(instance, **kwargs):
pass
#In any case defined function will remain as is, without any changes.
The ajax_request
decorator converts a dict
or list
returned by a view to a JSON or YAML object,
depending on the HTTP Accept
header (defaults to JSON, requires PyYAML
if you want to accept YAML).
from annoying.decorators import ajax_request
@ajax_request
def my_view(request):
news = News.objects.all()
news_titles = [entry.title for entry in news]
return {'news_titles': news_titles}
Note: autostrip
is deprecated and will be removed in a future version. Django now includes this by default.
from annoying.decorators import autostrip
@autostrip
class PersonForm(forms.Form):
name = forms.CharField(min_length=2, max_length=10)
email = forms.EmailField()
from annoying.functions import get_object_or_None
def get_user(request, user_id):
user = get_object_or_None(User, id=user_id)
if not user:
...
from annoying.fields import AutoOneToOneField
class MyProfile(models.Model):
user = AutoOneToOneField(User, primary_key=True)
home_page = models.URLField(max_length=255, blank=True)
icq = models.IntegerField(blank=True, null=True)
Note that if you're using Postgres you can use the built-in django.contrib.postgres.fields.JSONField, or if you're using MySQL/MariaDB you can use Django-MySQL's JSONField.
from annoying.fields import JSONField
#model
class Page(models.Model):
data = JSONField(blank=True, null=True)
# view or another place..
page = Page.objects.get(pk=5)
page.data = {'title': 'test', 'type': 3}
page.save()
from annoying.functions import get_config
ADMIN_EMAIL = get_config('ADMIN_EMAIL', '[email protected]')
Add this middleware as first item in MIDDLEWARE_CLASSES(or MIDDLEWARE)
example:
MIDDLEWARE_CLASSES = ( # MIDDLEWARE if you're using the new-style middleware
'annoying.middlewares.StaticServe',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.doc.XViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
)
It will serve static files in debug mode. Also it helps when you debug one of your middleware by responding to static requests before they get to debugged middleware and will save you from constantly typing "continue" in debugger.
from annoying.functions import get_object_or_this
def get_site(site_id):
base_site = Site.objects.get(id=1)
# Get site with site_id or return base site.
site = get_object_or_this(Site, base_site, id=site_id)
...
...
...
return site