Django community: RSS
This page, updated regularly, aggregates Community blog posts from the Django community.
-
Django Abstract Base Class - Model Inheritance
Model inheritance is a very useful and powerful feature of django, but used incorrectly it can cause a lot of confusion. Lets go ahead and take a look at some of those. Have you ever been looking through other peoples code and seen a model class Meta with abstract = True? That is the first type of inheritance we are going to look at, abstract base models. There is also multi-table inheritance, proxy models, and multiple inheritance available. Abstract Base Classes In this post we are going to focus on Abstract base classes. This is the easiest type of model inheritance to really understand because it works very much like normal inheritance. In OOP when you inherit from another object you get all of its members plus your own. You can modify those members or leave them the same. Abstract base classes are the same. Here are two example classes class Customer(models.Model): name = models.CharField(max_length=100) email = models.EmailField(max_length=100) address = models.CharField(max_length=100) purchase_history = models.ForeignKey('cart.Invoice') class Staff(models.Model): name = models.CharField(max_length=100) email = models.EmailField(max_length=100) address = models.CharField(max_length=100) bio = models.TextField() position = models.CharField(max_length=20) As you can see these two models are legitimate models with fields, but they do have common elements. In … -
Cyber Monday: 50% off Django book and videos
Are you looking for a good gift for a current or future Django developer? Check out Caktus technical director Mark Lavin’s work for O’Reilly: -
Comics v2.2.0 released with Django 1.5 support
Version 2.2.0 of my comics aggregator is now released. It features a general upgrade of dependencies, including the move from Django 1.4 to Django 1.5, and a lot of updates to comic crawlers. The Django upgrade was completed months ago and it’s been running my Comics instance since, so it’s about time to get it released before Django 1.6 arrives in a month or two. Regarding the crawler updates, it’s a bit sad to see that many of the crawlers have been broken for months without me or anybody else noticing, but it’s hard to catch some content lacking in the middle of a firehose of similar content. I guess I’ll have to make it a monthly task to look through the crawler status page of my Comics instance and do patch releases with updated crawlers. Check out the project docs for more information about Comics and this release in particular. -
Comics v2.3.0 released with better mobile support
Version 2.3.0 of my comics aggregator is now released. As always, dependencies have been updated, including the routine Django upgrade from Django 1.5 to 1.6, just in time for the upcoming 1.7 release. The largest change this time around is the move from Bootstrap 2 to 3, which includes a refreshed, flatter design and lots of tweaking to make Comics both look good and work nicely on mobile devices, something it didn’t use to do. The dependency overview at requires.io has been a great motivation for doing some maintenance work on Comics. The only dependency left outdated is django-registration, as 1.0 moves to class-based views, which requires some larger changes to my customizations. Thus, the upgrade of django-registration has been deferred together with the related upgrade of my vendorized copy of django-invitation. Most, if not all, of the other dependencies seems to support Python 3 now, though some lack the right Trove classifiers in their PyPI registration, so they are not correctly labeled by requires.io. I found an open pull request for cssmin and a recent commit for django-compressor adding the missing Trove classifiers. I’ve also done my part to improve the Python 3 metadata by sending a pull request … -
Sorting querysets with NULLs in Django
One thing which I’ve found surprisingly hard to do in Django over the years is sort a list of items on a database column when that column might have NULLs in it. The problem is that the default Postgres behaviour is to give NULL a higher sort value than everything else, so when sorting in descending order, all the NULLs appear at the top. This is particularly strange if, say, you want a list of items sorted by most recently updated, and the ones at the top are the ones that have never had an update. If we were writing the SQL directly, we could just add NULLS LAST to the ORDER BY clause, but that would be a really rubbish reason to drop down to raw SQL mode in Django. Fortunately, Django 1.8 has introduced a new feature: Func() expressions. These expressions let you run SQL-level functions like LOWER(), SUM() etc. and annotate your queryset with a new column containing the result. I didn’t want to run a database function, but what I discovered was that it is really easy to subclass and make your own Func() expression, giving you access to a template for generating SQL! The base … -
Moya Template Language
Moya's template language is a spiritual successor to Django, and Jinja templates. It borrows a number of constructs from both, and adds a few of its own. There is a slight difference in the syntax in that variables are substituted with ${variable} rather than {{ variable }}, but tags still use the familiar {% tag %} syntax. Template languages are generally quite extensible, so there is probably nothing that Moya template can do that Django / Jinja can't (via a plugin or extension), but there are a few things which are I think are more elegant in Moya's templates language (and built-in). I'm going to talk about a few of them in this post. The Attrib Tag How often have you written code like this? <div id="{{ article_id }}" class="{% if type %}{{ type }}{% endif %}{% if active %} active{% endif %}{% if highlight %} highlight{% endif %}"> {{ content }} </div> This code renders a div with an id attribute and a few optional classes. It is easy to follow, but verbose. It's also a little error prone to write; we have to be careful about the whitespace between the classes, or we could end up generating the … -
Fixing SSL certificate chains
This blog post applies when the following two cases are true: Your browser does not complain about your https site. Everything seems fine. Some other tool does complain about not finding your certificate or not finding intermediate certificates. What is the problem? So: your browser doesn't complain. Let's see a screenshot: Examples of the errors you can see Some examples of complaining tools. First curl: $ curl https://api.letsgxxxxxxx curl: (60) SSL certificate problem: Invalid certificate chain More details here: http://curl.haxx.se/docs/sslcerts.html curl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alternate file using the --cacert option. If this HTTPS server uses a certificate signed by a CA represented in the bundle, the certificate verification probably failed due to a problem with the certificate (it might be expired, or the name might not match the domain name in the URL). If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option. curl has the right error message: Invalid certificate chain. Let us look at wget: $ wget https://api.letsgxxxxxx --2015-11-23 10:54:28-- https://api.letsgxxxxx Resolving api.letsgxxxxxx... 87.233.157.170 Connecting to … -
How To Create Installable Django Packages
What I mean by an "installable Django package": a reusable component that can be shared across Django projects, allowing us to combine our own efforts with others. Some examples include: django-test-plus django-crispy-forms dj-stripe dj-spam Ever want to quickly create a similarly installable Django package to submit to PyPI and Django Packages? One that goes beyond the basics described in the Django tutorial? Specifically, a package that includes: Test runner so you don't need a example/test project (Although those can be useful). The important configuration in place: Travis, editorconfig, gitignore, etc. The important documentation in place: Readme, License, Read the Docs-ready Sphinx docs, etc. Static files ready to go. A base DTL/Jinja2 template ready to go. All those other fiddly bits not included in django-admin.py startapp that are hard to remember. Well, here's how I do it. Introducing cookiecutter-djangopackage First, get Cookiecutter. Trust me, it's awesome: $ pip install cookiecutter Now run it against this repo: $ cookiecutter https://github.com/pydanny/cookiecutter-djangopackage.git You'll be prompted to enter some values. Enter them. Then an installable Django package will be built for you. Warning: app_name must be a valid Python module name or you will have issues on imports. Enter the new package (in my case, … -
How To Create Installable, Reusable Django Packages
What I mean by an "installable Django package": a reusable component that can be shared across Django projects, allowing us to combine our own efforts with others. Some examples include: django-test-plus django-crispy-forms dj-stripe dj-spam Ever want to quickly create a similarly installable Django package to submit to PyPI and Django Packages? One that goes beyond the basics described in the Django tutorial? Specifically, a package that includes: Test runner so you don't need a example/test project (Although those can be useful). The important configuration in place: Travis, editorconfig, gitignore, etc. The important documentation in place: Readme, License, Read the Docs-ready Sphinx docs, etc. Static files ready to go. A base DTL/Jinja2 template ready to go. All those other fiddly bits not included in django-admin.py startapp that are hard to remember. Well, here's how I do it. Introducing cookiecutter-djangopackage cookiecutter-djangopackage is a Cookiecutter template for creating reusable Django packages. Using it is easy: First, get Cookiecutter. Trust me, it's awesome: $ pip install cookiecutter Now run it against this repo: $ cookiecutter https://github.com/pydanny/cookiecutter-djangopackage.git You'll be prompted to enter some values. Enter them. Then an installable Django package will be built for you. Warning: app_name must be a valid Python module name … -
How To Create Installable, Reusable Django Packages
name : Django Package Ecosystem: cookiecutter-djangopackage align : center alt : Django Package Ecosystem: cookiecutter-djangopackage target : https://www.pydanny.com/how-to-create-installable-django-packages.html What I mean by an \"installable Django package\": a reusable component that can be shared across Django projects, allowing us to combine our own efforts with others. Some examples include: django-test-plus django-crispy-forms dj-stripe dj-spam Ever want to quickly create a similarly installable Django package to submit to PyPI and Django Packages? One that goes beyond the basics described in the Django tutorial? Specifically, a package that includes: Test runner so you don't need a example/test project (Although those can be useful). The important configuration in place: Travis, editorconfig, gitignore, etc. The important documentation in place: Readme, License, Read the Docs-ready Sphinx docs, etc. Static files ready to go. A base DTL/Jinja2 template ready to go. All those other fiddly bits not included in django-admin.py startapp that are hard to remember. Well, here's how I do it. Introducing cookiecutter-djangopackage cookiecutter-djangopackage is a Cookiecutter template for creating reusable Django packages. Using it is easy: First, get Cookiecutter. Trust me, it's awesome: $ pip install cookiecutter Now run it against this repo: $ cookiecutter https://github.com/pydanny/cookiecutter-djangopackage.git You'll be prompted to enter some values. Enter them. Then … -
Installing Wagtail
Wagtail has become a very popular CMS in the last year. Start with this video to see how to get it up and running for your project, and get content on the homepage.Watch Now... -
Introducing Moya Techblog, a Blogging Engine for Coders and Photographers
I've had a blog on my vanity domain for nearly a decade now. For the last 6 years, it has been powered by Django Techblog, which I wrote out of my frustration with syntax highlighting plugins in Wordpress. Techblog has happily served my blog those 6 years, with only minor hiccups when I half-heartedly ported the code to the latest Django. There was nothing terribly wrong with Django Techblog; it had multiple blogs, tags, search etc., but there were some annoyances that I didn't have the motivation to do much about. The custom markup system I used was clever, but I would often forget the syntax! The support for images was rudimentary and the single-threaded comment system wouldn't notify me of replies. So fast forward 6 years and the time is right to build a new blog system to fix the old niggles. This time around I had same requirements for syntax highlighting in both posts and comments, with a new requirement to be able to manage and display photographs, while supporting the same multi-blog and feed URLs. Moya Tech Blog The new blog engine running my blog is Moya Tech Blog. Posts and comments use markdown (by default), which … -
Nginx proxying to nginx: getting gzip compression to work
At work we use gunicorn as our wsgi runner. Like many, gunicorn advises you to run the nginx webserver in front of it. So on every server we have one or more websites with gunicorn. And an nginx in front. Nginx takes care, of course, of serving the static files like css and javascript. Some gzipping of the results is a very, very good idea: server { listen 80; server_name my.great.site; ... gzip on; gzip_proxied any; gzip_types text/css text/javascript text/xml text/plain application/javascript application/x-javascript application/json; .... } Two notes: The default is to only gzip html output. We also want javascript and json. So you need to configure gzip_types. (I copy-pasted this from one of my config files, apparently I needed three different javascript mimetypes... Perhaps some further research could strip that number down.) gzip_proxied any tells nginx that gzipping is fine even for proxied requests. Proxied requests? Yes, because we have a lot of servers and all external traffic first hits our main nginx proxy. So: we have one central server with nginx that proxies requests to the actual servers. So: nginx behind nginx: server { listen 443; server_name my.great.site; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect … -
Looking for an experienced Python Developer
My client, WildFoundry, is looking for an experienced Python developer to join us. We work in the field of IoT, and you will get to work with a variety of really cool technologies. Here's the job description: Job Description WildFoundry is seeking a senior Python web application developer on a 8 month contract to help us in the development of the dataplicity Internet-of-Things platform (dataplicity.com). You would be expected to work from your home or own office most of the time and very high quality candidates based in Slovakia, Poland and the United Kingdom will be considered. This is an unbeatable opportunity to work from home, earn excellent rates and join in with fast growing projects. Our web application runs on a combination of Python and django, and we’re really pushing the boundaries of what we can do with both of them. You will be challenged. You’ll be playing with everything from Amazon and Linode services to embedded PCs, and a bunch of new web technologies. You’ll be writing daemons, UI for django apps, code for embedded systems, websockets. We are seeking a top calibre developer well regarded in the community. If you’ve contributed code to OSS apps or have … -
Buildout 2.5.0 has much nicer version conflict reporting
We use buildout for all our django projects. Nothing wrong with pip, but buildout has extension possibilities build-in (for creating directories, installing user crontabs, local development checkouts and many more) that are quite helpful. And it works better when you need to use system packages (gdal, mapnik, etc). One area where buildout could use some improvement was the version conflict reporting. Let's say you have pinned django to 1.6.6 (old project that I'll upgrade to 1.8 this week) and you add the django debug toolbar. This is the error you get: The constraint, 1.6.6, is not consistent with the requirement, 'Django>=1.7'. While: Updating django. Error: Bad constraint 1.6.6 Django>=1.7 First things first. An easy one is to improve the wording of the message: While: Installing django. Error: The requirement ('Django>=1.7') is not allowed by your [versions] constraint (1.6.6) Now... so there is some package that requires at least django 1.7. But which one? Buildout did not tell you. Which would mean you'd have to grep in all your requirements' sub-requirements for which package actually requires the offending "django>=1.7"... I've now added some internal logging that stores which package required which dependency. After an error occurs, the list is searched for … -
Ember application structure
Ember.js applications are divided into multiple files and folders. All of which makes sense when we get to know what is where, so lets take a look on Ember application structure. -
Setting up ember-cli development environment with ember 2.1
In a series of tutorials starting with this one I'll try to showcase ember.js framework for building fronted web applications. As a backend there will be Django Rest Frameowork and more. As times change and JavaScript frameworks don't just download to your static folder I'll start with setting up Ember.js development environment with ember-cli. -
We need less powerful languages
Many systems boast of being ‘powerful’, and it sounds difficult to argue that this is a bad thing. Almost everyone who uses the word assumes that it is always a good thing. The thesis of this post is that in many cases we need less powerful languages and systems. Before I get going, I should say first of all that very little in this post is original. The train of thought behind it was set off by reading Hofstadter's book Gödel, Escher, Bach — an Eternal Golden Braid which helped me pull together various things in my own thinking where I've seen the principle in action. Philip Wadler's post on the rule of least power was also formative, and most of all I've also taken a lot from the content of this video from a Scala conference about everything that is wrong with Scala, which makes the following fairly central point: Every increase in expressiveness brings an increased burden on all who care to understand the message. My aim is simply to illustrate this point using examples that might be more accessible to the Python community than the internals of a Scala compiler. I also need a word about definitions. … -
MIT uses Evennia!
Evennia was recently used as a test bed to train an AI system to attempt to play a MUD as a human would - by only reading and understanding the text on the screen. Researchers at MIT (Massachusetts Institute of Technology) recently presented the paper Language understanding for Text-based games using Deep reinforcement learning (PDF) at a conference on natural language processing. A summary is in the MIT press release.I was contacted by these fine folks some time ago so I knew they had plans to use Evennia for their research. It's great to see they now have an article out on it! Evennia devs are also mentioned in the acknowledgements - so something for the Evennia dev community to be proud of! MUDs are tricky The main complication for an AI playing a MUD is that the computer has no access to the actual game state but must try to surmise how well it's doing only from the text given (same as a human would). The researchers compare the results from a range of deep-learning neural network algorithm that they train to play. To test their AI, the researchers first used Evennia to build a simple training "Home World": … -
How to send Jabber (XMPP) messages from Django
Did you ever want to have a simple Django notification bot? An intranet one which just sends you (or someone you tell it to) Jabber messages when certain events occur? So did I. Please, welcome: django-jabber. -
How to send Jabber (XMPP) messages from Django
Did you ever want to have a simple Django notification bot? An intranet one which just sends you (or someone you tell it to) Jabber messages when certain events occur? So did I. Please, welcome: django-jabber. -
Tip: How to get a single object`s value with Django ORM
There are times when you want to get a single field of a single object in the database. For example, just get the headline of the blog post #1, not fetching it’s body. How do you do it in a usual way? >>> BlogPost.objects.only('headline').get(pk=1).headline 'Hello world' # Or maybe even this way: >>> BlogPost.objects.values('headline').filter(pk=1)[0]['headline'] 'Hello world' Recently I’ve stumbled upon a shorter one: -
Tip: How to get a single object`s value with Django ORM
There are times when you want to get a single field of a single object in the database. For example, just get the headline of the blog post #1, not fetching it’s body. How do you do it in a usual way? >>> BlogPost.objects.only('headline').get(pk=1).headline 'Hello world' # Or maybe even this way: >>> BlogPost.objects.values('headline').filter(pk=1)[0]['headline'] 'Hello world' Recently I’ve stumbled upon a shorter one: -
When you shouldn’t use the Django admin
In case you’ve thought I detest django.contrib.admin — by no means. Actually it’s one of the Django’s greatest features, I really love it. In most cases. Here’s a real life story. We’ve had to quickly put up the first version of an intranet claim tracking system, and one of our developers was just crazy about the Django admin… So why not, we’ve got along with the stock interface as the primary one for ... -
When you shouldn’t use the Django admin
In case you’ve thought I detest django.contrib.admin — by no means. Actually it’s one of the Django’s greatest features, I really love it. In most cases. Here’s a real life story. We’ve had to quickly put up the first version of an intranet claim tracking system, and one of our developers was just crazy about the Django admin… So why not, we’ve got along with the stock interface as the primary one for ...