Jeff Croft

I’m a product designer in Seattle, WA. I lead Design at a stealthy startup. I recently worked at Simply Measured, and previously co-founded Lendle.

Some of my past clients include Facebook, Microsoft, Yahoo!, and the University of Washington.

I’ve authored two books on web and interactive design and spoken at dozens of conferences around the world.

But seriously, who gives a shit?

Blog entry // 05.02.2006 // 11:50 PM // 174 Comments

Django for non-programmers

In the 48 hours since I launched the new version of this site, I’ve been inundated with questions about Django, the Python-based web application framework I used to build it. I’ve pointed many people at the official Django website, which is loaded with great information. However, most of it is aimed at programmers — and rightfully so. Django is, after all, a platform for programming web applications.

I wanted to take a moment or two while I still have your attention to tell you why I think Django is a great tool for those of us who really aren’t programmers, as well.

I consider myself a web designer. I don’t dabble too deeply into programming. That having been said, I have downloaded, installed, and customized many-a-PHP-script in my day, and I’ve even written a few simple scripts of my own in languages like PHP, Perl, and Javascript. For the most part, I hate programming. It hurts my head (and the keyboard I bash it into, as well). But, I love what a good programmer can do. I want to build cool web applications — but they generally require someone working alongside me, doing all the dirty work while I “make it pretty.”

Enter Django.

What is Django?

According to the official site, “Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.”

What that means to me, as a non-programmer, is that Django is a set of core components that takes care of a lot of the programming work that goes into building web applications and other database-driven websites so I don’t have to. Those things that must be done for nearly every web site are built-in, so I can ignore them and focus on what makes each site unique. Here’s an (incomplete) list of things Django provides out-of-the-box:

  • Authentication and authorization (users, groups, and permissions)
  • Database connectivity (several supported databases, no SQL needed)
  • Administrative interface (for adding/deleting/modifying items in the database)
  • URL configuration (for making simple, clean, sexy URLs)
  • Internationalization (makes localization easy)
  • Feed syndication (RSS/Atom)
  • Comments on any type of object (both anonymous comments, which Django calls “free comments” and comments that require registration)
  • Flat pages” (simple HTML content stored in the database and passed into a template)

Now, if you’re used to building sites using a blogging app (Wordpress, TXP, etc.) as a CMS, you’re used to getting all that for free. But you’re also getting a lot of things built-in that maybe you don’t want (unless, of course, you’re building a blog). The limitation I ran across in using a blogging app for my personal site is that I wanted it to be more than just a blog. As soon as I tried to hack a blog into a photo gallery, or a links feed, or a statistics database, a game of Sudoku, or whatever else I could think of, things started to get crufty. I also built a website in which I tried to use a discussion forums app (vBulletin) as a CMS, and that had the same results. It worked — sort of — but it wasn’t extensible, was very hackish, and just generally was inelegant.

With Django, you get all of these things and none of the limitations of a blogging app.

How do you build a program with Django?

Django loosely subscribes to the Model-View-Controller approach to programming. If you’re like me, that means almost nothing to you. According to Wikipedia, “Model-view-controller (MVC) is a software architecture that separates an application’s data model, user interface, and control logic into three distinct components so that modifications to one component can be made with minimal impact to the others.” Sound familiar? It’s quite a similar approach to the one we take in the web standards world with the structure (XHTML), presentation (CSS), and behavior (DOM scripting) layers.

In Django, we call the view layer “templates” and the controller layer “views.” Confusing? Perhaps. Here’s what the official Django website has to say on the matter:

That’s because Django isn’t strictly a MVC framework. If you squint the right way, you can call Django’s database layer the “Model”, the view functions the “View”, and the URL dispatcher the “Controller” — but not really. In fact, you might say that Django is a “MTV” framework — that is, Model, Template, and View make much more sense to us. So, although we’ve been strongly influenced by MVC — especially in the separation-of-data-from-logic department — we’ve also strayed from the path where it makes sense.

Models

In plain English, models are the sets of fields you’ll use in your database. A basic model for a blog post would contain fields like “Title,” “Body,” “Date published,” “Tags,” etc. A simple model for an address book entry might include “Name,” “Address,” Phone number,” and so on.

Django handles the creation of your databases for you once you tell it what your model is. No need to write SQL (w00t!). Here’s what a Django model for a simple blog post looks like:

So, going through this line by line, we are:

  1. Creating a short text field called “title” with a maximum length of 200 characters.
  2. Creating a “slug” field that is automatically created from the calue of the “title” field. “Slug” is a newspaper term, but what it means here is the final bit of the URL. For example, a post with the title, “A bit about Django” would become, “bit-about-django” automatically (you can, of course, change it easily if you don’t like the auto-generated slug).
  3. Creating a date/time field called “pub_date” and giving it a display name of “Date published.” Django would have automatically created the display name “Pub date” if I hadn’t specified this (which probably would have been just fine for most uses).
  4. Creating a large text area field called “body.”
  5. Creating a many to many relationship (called “tags”) with another model called “Tag.” Many to many indicates that each post may have many tags, and each tag may be associated with many posts.
  6. Creating an image upload field called “lead_image” that will put uploaded files in img/blog-posts/lead and has the help text “Should be 706px wide” in the administrative interface.
  7. Creating an “author” relationship to Django’s built-in “User” model.
  8. Creating a simple true/false field called “enable_comments” that defaults to “True.”

From these nine lines of code, Django will create the SQL needed and initialize a database table in your chosen database (PostgreSQL, MySQL, etc.).

If you like, Django can give you a sexy, simple administrative interface where you can create, remove, delete, and update entries to your “Post” model. All you need is a few more lines of code:

These four lines create a very pretty admin area (designed by Wilson Miner) with appropriate entry fields for all of your fields. The “pub_date” field will automatically get a pop-up calendar for choosing a date. The “enable_comments” field automatically knows to use radio buttons for its interface. The “lead_image” field will be a browser-based upload tool. Et-cetera. Without doing a thing, you’ll get an admin interface the likes of this:

Adding a blog post in the Django admin area

I’ve specified in my Admin class that I want to see the fields “title,” “pub_date,” and “enable_comments” in the list display of my posts. I’ve also said that I want a search field that searches the “title,” “slug,” and “body” fields, and that I’d like to be able to filter my posts by the date published and whether or not they have comments enabled. The list view will look something like this:

Viewing a list of blog post in the Django admin area

In other words, you’ve recreated Wordpress in 13 lines of code. Okay, maybe that’s a slight exaggeration — but these 13 lines are truly the most difficult thing a non-programmer will have to do to get a basic blog app running in Django.

It’s worth noting that Django admin interface is entirely optional. You could just as easily build you own admin interface. I think the built-in one is great, so I didn’t take the time to build my own.

Views

Views are the place most serious programmers are going to spend their time in Django. The purpose of a view is to define a “type” of page within your site, and the data they need in order to serve their purpose. For example, one view in a blog app might be “post detail,” which would have access to everything you need for a page like the one you’re looking at now: a particular “Post” object and all of its related fields (as defined in our models), its associated tags and comments, etc. Views can be very simple or painfully complex, depending on what you are trying to do.

For us non-programmers, Django provides built-in views (called “generic views”) that cover about 90% of everything you’ll ever want to do. Almost all of jeffcroft.com is done with generic views. Without writing a single line of code, you get:

  • Date-based views, for drilling down into date-based data. Date-based views can be used to create yearly, monthly, and daily archives of a particular model in your database — like blog posts, for example. The archive here at jeffcroft.com is an example of date-based generic views.
  • List/Detail views, for displaying a list of objects and a detail page for each one. The photos section at jeffcroft.com is an example of this type of generic view (list/detail).
  • Create/remove/update views, which includes a set of functions for creating, editing and deleting objects. I didn’t use this type of view here at jeffcroft.com, but it would allow me, say, to put a tag entry field on this page and let readers add tags to blog posts.

I only found one thing I couldn’t do with generic views in building this site: search. I had to write my own view for this, but found it to be astonishingly easy to do. If you can dabble in PHP, you can write a simple view, no doubt. That having been said, a built-in search engine is something I think Django would be wise to add.

Templates

Templates, for the most part, are HTML pages that have access to information in the database (by way of the view, which passes it along). I’ve already written pretty extensive entries on how Django templates work, so I won’t be redundant here. For you, the designer, templates will be the simplest and most fun part of building Django apps.

URL Configuration

The last thing you’ll need to do in building a Django application is tie your views and templates to URLs. Django uses regular expressions for this, which allows you to do some incredibly complex things if you want to. Here’s what the URL configuration looks like for the photos section of this site:

Lets look at this bit-by-bit:

  1. We import the model that we’re dealing with — in this case, “Flickr_photos” in the application called “tumblelog.”
  2. We state that URLs that match the regular expression “^photos/$” should use the object_list generic view. It should list out items from the “Flickr_photos” model, put 56 items on each page, and use the template located at photos/photos_list.html.
  3. We state that that URLs that match the regular expression (?P<slug>[^/]+)/$ should use the object_detail generic view. It should, again, use the “Flickr_photos” model. The “slug field” (or, the part of the URL that comes after /photos/) is the “photo_id” in our model, and it should use photos/photos_detail.html as its template.

In plain english, this means that the URL /photos will display a paginated list of all photos using my photos_list template, and a URL like /photos/114738674/ will display a detail page for the photo with the ID “114738674” using the photo_detail template.

Conclusion

While this post is a bit long and may seem a bit daunting at first, the bottom line is that I’ve literally given you everything you need to write a simple application in Django. Once you have Django installed and running, you can truly build a basic CMS in thirty minutes (plus however much time you want to spend on the HTML and CSS).

Do I think you should build a CMS in Django? That depends. If all you want to do is host a basic blog, maybe not. There are already several blogging apps that have proven to be stable, robust, and feature-packed out there. Many of them are free and can be installed in 15 minutes. But if you’re finding that using a blogging app as your CMS is limiting you, or you want to create another sort of web application entirely, give Django a look.

Even you, the non-programmer, can build something very cool in not-very-much time. I built the current incarnation of jeffcroft.com in about a month at around two hours per day. A large part of that time was dedicated to learning the Flickr and del.icio.us APIs and how to parse their XML results so that I could store the data in my Django database. If I had been creating all my content on site and not pulling it in from other places, I probably could have cut the time taken to build this site in half.

If you’re looking to do more on the web, give Django a try — and let me know how it goes.

Comments

  1. 001 // matt // 05.03.2006 // 7:37 AM

    Thanks so much for breaking down Django for us non-technical types. While I am currently using Wordpress for all of my blogging needs, I would love to be able to switch over to a hometown platform (I live in Lawrence).

    I love what you guys are doing with lawrence.com etc…and keep up the interestings posts on Django. I might have to install it on my server and give it a try. Thanks!

  2. 002 // Steve // 05.03.2006 // 8:10 AM

    On face value it all seems too easy.

  3. 003 // Luke L // 05.03.2006 // 9:24 AM

    You’re telling me this now! When I’ve just finished writing my own CMS/Blog system in plain old vanilla php! Only joking (about the being mad part, I have just finished writing my own cms). Excellent article, your tutorials are getting better and better. I definetly want to try django now.

  4. 004 // Prabhath Sirisena // 05.03.2006 // 9:34 AM

    All this time I was wondering what this whole django thing is, without actually trying out anything - it was a pleasant surprise to see your beautiful redesign done with the framework. If this is not a PoC for django, I don’t know what is.

    Thanks for the insightful post!

  5. 005 // Gilberto Creque // 05.03.2006 // 10 AM

    Great post. This got me very interested in Django. Your site is looking great and I’m sure Django will appreciate you helping spread the word.

  6. 006 // Nicole // 05.03.2006 // 10:13 AM

    Wow, Django sounds great. I’m pretty fickle when it comes to frameworks, but this has me wanting to try Django for my parents’ website.

    Also, I love the new design. The thought and work you put into it is very evident.

  7. 007 // blah // 05.03.2006 // 10:17 AM

    Hosted at Dreamhost? Any problems? (I’m thinking of switching to Dreamhost and to Django…)

  8. 008 // Thomas M. // 05.03.2006 // 10:22 AM

    Jeff, I’m planning on swithching all my domains to Dreamhost and wanted to work with Django over there … would suggest following the install on Dreamhosts wiki page?

    http://wiki.dreamhost.com/index….

    At the top of the page it’s written “If Django is crucial to your site, you may not want to use Dreamhost. Django is not officially supported and many users have reported reliablity problems.”

    Thanks in advance.

  9. 009 // Jeff Croft // 05.03.2006 // 10:32 AM

    Re: Dreamhost…

    I got Django running on Dreamhost without any trouble, using the instructions from the Wiki that Thomas linked above. It seemed to work fine in limited testing and I don’t have any evidence that it won’t work. The official Django website lists Dreamhost as “Django-friendly.”

    That having been said, I also saw the note that Thomas pointed out and heard from a few people that had some minor issues with Django on Dreamhost, so I decided to go with Gypsy Hosting, even though Dreamhost seemed to be working fine for me. Gypsy hosting is run by the guy that sits next to me at work, so it was nice for me to be able to physically smack him if there’s a server problem, etc. :)

    All in all, I would say this: If you’re already on Dreamhost and you just want to play with Django and see if it works for you, I’d do it there. If you know you’re going to use Django to build a mission-critical site, then I might consider something else on the official list of Django-friendly web hosts.

    But that’s true whether you’re doing Django or not. Dreamhost is a great value, but you do get what you pay for — and I wouldn’t host any site i considered to be mission critical there (just as the CSS Reboot guys about that).

  10. 010 // Wilson Miner // 05.03.2006 // 10:32 AM

    Great writeup, Jeff. Generic views are indeed Django’s gift to non-programmers (or lazy programmers).

    I don’t know when it’s going to wear off, but I still get weirded out seeing screenshots of the Django admin for other people’s sites.

    blah: The Django parts of Jeff’s site (and mine) are actually hosted by Gypsyhosting, a Django-only host run by our friend and coworker, Jacob. I’m still using Dreamhost to serve media and some extra PHP stuff (like Mint).

  11. 011 // CoolGoose // 05.03.2006 // 10:33 AM

    Thanks for the tips jeff they are great. It’s just what i need from a theoretical point of view for starting my little site.

  12. 012 // Thomas M. // 05.03.2006 // 10:46 AM

    Jeff, Thanks for the feedback .. I noticed the Gypsy Hosting and wondered about that.

    My reason for using Django was mainly for testing purposes, so I’m glad to know that Dreamhost is on the “Django Friendly” list.

  13. 013 // Jeff Smith // 05.03.2006 // 10:49 AM

    Excellent post Jeff. As I told you before I’m looking to extend my blog to include many more areas of interest, adn I think this is just what I needed to get going with Django. Cheers!

  14. 014 // James John Malcolm (AkaXakA) // 05.03.2006 // 11:24 AM

    That sounds pretty darn nice and well made!

  15. 015 // Suthers // 05.03.2006 // 12:58 PM

    Hi Jeff — loving the site!

    I’ve been working on-and-off for the last wee while on a couple of Django powered sites and was wondering; a) What are you using for your search? and b) How are you handling the AJAX stuff, custom views or some coolness with the Accept header?

    Cheers.

  16. 016 // Jeff Croft // 05.03.2006 // 1:19 PM

    Suthers…

    a) I’m just doing SQL queries. The hardcore geeks that sit around me at the office think i should be smacked silly for this. I think it works, and it’s fast, so they can go to hell. :)

    b) Neither one. I just have a view and template called livesearch and am using Prototype javascript library to pull it in AJAX-ily (again, my co-workers would like to smack me for using Prototype). You can even see what my livesearch looks like on it’s own if you hit this:

    http://www2.jeffcroft.com/search…

  17. 017 // roberthahn // 05.03.2006 // 2:58 PM

    Jeff: eh? why would your co-workers want to smack you for using Prototype?

  18. 018 // Jeff Croft // 05.03.2006 // 3:03 PM

    Robert…I’ll ask them to respond here, I’m sure they can explain it better than I. :)

  19. 019 // James Bennett // 05.03.2006 // 3:29 PM

    roberthahn: because Prototype is evil. Libraries which modify the behavior of a language’s built-in types and, worse, which do so in a way that breaks language constructs developers rely on, are bad, mmkay?

    (and to clarify, I’m talking about Prototype’s extensions to the Object prototype, which breaks the ability to reliably do for(var in obj) in JavaScript)

  20. 020 // roberthahn // 05.03.2006 // 3:36 PM

    James: thanks for the response. What would you suggest using instead?

  21. 021 // James Bennett // 05.03.2006 // 3:52 PM

    roberthahn: I’m a fan of Dojo, and I’ve been doing the initial work to integrate it into Django. Give it a bit of time and that will land on Django’s trunk.

  22. 022 // Erik Eklund // 05.03.2006 // 4:14 PM

    Thanks for a great post. After reading I got straight into installing Django on my DreamHost website, but I ran into some minor problems..

    I followed the dreamhost wiki, with some slight vaiations (the init and createsuperuser commands didnt work, so I had to do it manually). In the end, I got everything in its place, and the files that are supposed to be.

    However, when I try loading http://mysite.com/django.fcgi, all I get is an ever-loading page, just keeping on , loading forever. I tried creating a hello.fcgi according to the troubleshoot part of the wiki, but its the same there. It just keeps on load, never finishing anything Any response would be helpful, although it may just be the dreamhost servers acting weird again. I’ll try once more tomorrow.

  23. 023 // Ryan // 05.03.2006 // 5:20 PM

    Thank you so much for the detail in this post. I’m really looking to move to Django for some personal stuff, as well as for work. Posts like this really make it a lot easier for me to persuade people here.

  24. 024 // roberthahn // 05.03.2006 // 6:56 PM

    James: Thanks for the tip. I’m actually a Rails guy myself, so Prototype is all I know for now. Familiarity has lots of inertia, you know? I’ll check out Dojo though and see what it’s got.

  25. 025 // Colin // 05.03.2006 // 7:16 PM

    I’m overhauling a site I started four years ago when I got into web design and development. This year, I wanted to rebuild it all on my own: my own CMS in PHP, my own AJAX scripting, my own design, my own authoring/moderating, the works.

    Great idea that’s turned out to be…

    Django to the rescue! I hope. I was considering doing WordPress-as-CMS until I found your article this afternoon. Wish me luck.

  26. 026 // Yas // 05.03.2006 // 9:26 PM

    Thanks for the wonderful overview, Jeff. I’ve been looking at Django ever since I read you comment over at Khoi’s joint.

    Django seems elegant ad extremely powerful for those of us who are more inclined to use a text editor to build a website.

  27. 027 // deelan // 05.04.2006 // 5:32 AM

    For all your guys interested there’s a video for Django Presentation @ Google TechTalks April 26, 2006 by Jacob Kaplan-Moss.

    Topics are roughly the same as found in Jeff’s post, but more programmer oriented, plus some history behind Django.

  28. 028 // Benjamin David // 05.04.2006 // 9:24 AM

    Hi Jeff, what do you think about Code Igniter ?

    It’s a PHP and MVC based framework that helps people building web apps quickly.

    I don’t know much about Perl and don’t even know if it’s installed on my computer. One of the things I liked in code igniter is that I don’t need to learn a new language or something. You program everything in PHP and Code Igniters helps you with recurent routines.

    Here is a link to Code Igniter.

  29. 029 // Jeff Croft // 05.04.2006 // 9:34 AM

    Benjamin-

    I’m not familiar with it. I’m all about using the right tool for the job, so if it works for you, great! After spending some time around Python, I definitely “get” what it is about PHP that the Ruby and Python camps dislike. Because of that, I’d prefer to avoid PHP — but if it works for you, go for it!

  30. 030 // J.D. // 05.04.2006 // 9:43 AM

    Thanks for writing this up Jeff. I have been using Wordpress, but it doesn’t exactly fit my needs for my portfolio site. Since I am somewhat familiar with both python and PHP, this has given me the incentive to take a look at Django. And I am sure I am not the only one. Thanks! Great reboot design by the way.

  31. 031 // Benjamin David // 05.04.2006 // 10:15 AM

    Thanks for answering Jeff !

    What do you find in Python (was meaning Python and not Perl in my last post :) that you wouldn’t in PHP ? Do you find it more powerful ?

    I actually don’t really get which dislikes you’re talking about in your last comment.

    Thanks again and great reboot !

  32. 032 // Jeff Croft // 05.04.2006 // 10:29 AM

    For me personally, it’s the syntax that wins me over for Python vs. PHP. PHP is so full of punctuation that is difficult to type, easy to forget, and hard to read, where as Python limits that quite a bit.

    Take a look at the Wikipedia entry on Python and you’ll see what I mean.

    It’s just simpler to understand — for me, anyway. And that’s important when you’renot really a programmer and you do as much reading and tweaking other people’s code and you do writing your own. In Python, I can almost always read a script and make sense of what’s going on. I can’t say that about PHP.

  33. 033 // Eugene Lazutkin // 05.04.2006 // 11:16 AM

    Excellent post! Way to go, Jeff!

  34. 034 // Paul Stamatiou // 05.04.2006 // 11:37 AM

    Awesome post Jeff. I will be building a site for someone this summer and was looking for an easy way to tie in many advanced, not necessarily blog-related, features. Django seems like just the ticket. However, I wish it was written in RoR, then I could get deeper into it.

  35. 035 // Jeff Croft // 05.04.2006 // 11:40 AM

    Paul-

    Django effectivley is a competitor to Ruby on Rails. It covers much of the same ground. Django has been called “Rails for Python” (although I think that does it a bit of a disservice).

    Point is, Django and Rails are both web application frameworks, and are very simialr in many ways. The key difference, of course, is that Django is for Python and Rails is for Ruby.

  36. 036 // Karl Guertin // 05.04.2006 // 1:23 PM

    A bit more on javascript frameworks:

    prototype.js is evil only if you consider the code you wind up with javascript. As long as you realize that it is, in fact, prototype and you use exclusively prototype packages, you’re fine. It’s only when you mix prototype and normal javascript that problems happen. Unless you’re on rails, the main reason to use prototype isn’t the lib itself, but rather the main reason is scriptaculous, which rocks because it provides easy solutions to common js usage scenarios.

    dojo is exremely powerful and very very large for a javascript framework. You only have to know pieces, but I find it difficult to get going quickly because I’m never sure whether what I want to do is built in or not. That being said, dojo is amazingly far ahead of the other frameworks. I think they’re between 6months and a year ahead of the curve. It will be THE framework when it matures and the sharp edges get filed a bit more.

    For this reason, unless I know I’m starting a large project, I normally go with MochiKit, which is quite small and quite elegant. Its similar in scope to prototype, but it’s not evil. Bob Ippolito (the primary author) is a long time Python developer and MochiKit borrows a lot of ideas from Python and Twisted —a python networking lib. A scriptaculous port (hurrah) is in development and is slated for the next release. It’s actually working if you’re willing to check it out from a branch.

    @Jeff: Nice work on the site and good Python evangelism. I’d appreciate if you could either optimize the live preview or provide an option to disable it. It can only handle about 10wpm here, which is painful when you’re trying to post a comment. This is in Firefox on a 3GHz P4 running linux, so I don’t think it’s the machine.

  37. 037 // James Bennett // 05.04.2006 // 1:49 PM

    Karl, I agree that Protoype is “evil JS” only if you consider it to be JS (and I can see a strong argument that Protoype is actually a JS-based domain-specific language for doing AJAX-y things, in much the same way that Rails is arguably a Ruby-based DSL for web-application development — maybe that’s why Rails integrated Prototype?).

    But at the same time, I think Prototype creates a dangerous illusion in many people’s minds that what they’re doing with it really is JavaScript, and that illusion gets shattered the moment they try to use any non-Prototype-based code with it. So either way it’s evil ;)

  38. 038 // Paul Stamatiou // 05.04.2006 // 7:20 PM

    Now I need to look for a webhost for my client that already has Python support, or attempt to install Python on my own on a server account with ssh & root.

  39. 039 // Rob // 05.05.2006 // 1:08 AM

    Would you mind also sharing your Tag model? It would be instructive to really see how ManyToMany works.

  40. 040 // Jeff Croft // 05.05.2006 // 1:16 AM

    Rob-

    No problem at all. I should point out, for the record, that the model used above for the blog post is not exactly the model I use here at jeffcroft.com. I took out a few fields so as to not be redundant (for example, I have fields for intro, summary, and pull quotes). Also, my blog app is written aganist an older (non “magic-removal”) version of Django, but I updated the syntax in the blog post for the latest version.

    This is what my Tag model looks like, updated for the latest version of Django:

    class Tag(models.Model):
        name = models.CharField(maxlength=200, core=True)
    
        class Admin:
            pass
    
        def __repr__(self):
            return self.name
    
  41. 041 // Joshua Blount // 05.05.2006 // 1:59 AM

    Wow, this absolutely sounds incredible. Of course as per usual I’ve spent the past 3 hours just tring to get Django installed on my dreamhost server, and have yet to be successful. I’ll let you know if I find out anything different!

    (Thanks again for the writeup, I really needed a new non-billable project!)

  42. 042 // Norbert // 05.05.2006 // 6:04 AM

    hmm, i remember looking into django about a year ago or so but ended up with ruby on rails instead; main reason being that documentation for django at that time was poor, cluttered, and scatty, and there was just soo much magic goin on it scared the hell out of me; has that improved?

  43. 043 // Branko // 05.05.2006 // 6:50 AM

    Which text editor do you use for Django?

  44. 044 // Jeff Croft // 05.05.2006 // 8:21 AM

    Norbort: There was too much magic going on, no doubt. That’s why the “magic removal” branch was started, and it’s recently been merged into trunk. Django is now magic-less! As for documentation, I’m not sure how it was a year ago, but I’ve been fairly impressed with Django’s documentation. like most open source projects, it’s not perfect, but I’ve found it to be adequate and better than most open source projects.

    Branko: I use TextMate. There’s a TextMate bundle available for syntax coloring and such. Of course, any text editor will do.

  45. 045 // Katie // 05.05.2006 // 8:41 AM

    So there is hope for us non-programmers! Thanks for the article!

  46. 046 // Michael Camilleri // 05.06.2006 // 11:35 AM

    Excellent article. I am probably more of a non-programmer than you, but the more I read the more I want to give Django a try.

    After moving beyond blogger, I tried MovableType … well, that sucked, to put it simply. I was frustrated by the number of plug-ins that I needed to make it do what I want and I had a host of issues with the static templates being very limiting. When MovableType started charging people to use their software for anything more than a one-user weblog, I decided to move to WordPress. WordPress is an improvement with dynamic templates, but it too has its shortcomings. The system of template tags is extremely inconsistent — parameters don’t match from tag to tag and many tags produce HTML. What if I don’t want the ‘Read more’¦’ link following an entry wrapped in

    tags? Hacking a photo gallery into either of these systems was a painful experience.

    After two days of trying to wrangle WordPress into doing what I want, I was ready to order a PHP and mySQL book from Amazon, but then I found a link to this article.

    After reading this article and watching the “Snakes and Rubies” presentations as well as the Google TechTalks presentation that deelan mentioned in a previous comment, Django seems perfect (I like the personalities of the people who develop it too). I want my site to have a weblog, photo gallery, ‘linklog,’ a links page, and sections for various other things, all managed by the CMS. With Django, it seems like I don’t have to learn a full-blown programming language, but I am not restricted by a canned webloging app.

    Before I dive into this, I want to know how much documentation there is because I am truly a non-programmer and this is going to be a big step for me. After skimming the tutorials on the official Django site, things seem pretty clear, but I want to make sure that they don’t assume too much. Will someone with little to no programming experience beyond sticking tags into a template be able to handle this with the aid of the documentation? Wilson Minor mentions (http://www.wilsonminer.com/posts…) that you and he both use ‘two Django apps (the blog and the tumblelog) that do most of the heavy lifting,’ however he doesn’t provide any links. Are these publicly available? Messing with someone else’s code always seems to help me learn the most.

  47. 047 // Jeff Croft // 05.06.2006 // 12:55 PM

    Michael-

    Glad to hear you liked the article and the video. And, I’m sure Adrian and jacob will be glad to hear you like their personalities, as well. :)

    Using Django to do what you want it to do is going to require some programming. But, so would have learning PHP and MySQL, right? :) I can say with absolute certainty that building a CMS in Django will require you to write less code than PHP/MySQL, though.

    Documentation for Django is pretty good overall, but there’s certainly not as much of it as there is for PHp/MySQL. Jacob and Adrian (the two guys you saw in the videos) are working on a Django book for Apress right now. The release of that should clean up any missing patches there are in documentation right now.

    The blog app and tumblelog that Wilson and I are not currently available publicly. Several of us at World Online have built blog apps and other related “personal site kind of things,” and we’re talking about pooling our efforts and releasing a Personal CMS To Rule Them All. But, no promises — we’re all pretty busy. :)

  48. 048 // David Logie // 05.06.2006 // 3:18 PM

    Erik: Do you mind telling me how you went about doing the createsuperuser and init manually? I’ve been trying to work it out for a while now, to no avail.

    Thanks :)

  49. 049 // Logan Brown // 05.07.2006 // 8:10 PM

    Jeff, wonderful site, thanks alot for the write-up. I’m glad to know that Django is non-programmer friendly but I’ve been having issues figuring out to install it on my server. Would love to hear how you went about this.

  50. 050 // Jeff Croft // 05.07.2006 // 8:13 PM

    Logan-

    To be honest, I signed up for Gypsy Hosting, a Django-specfic hosting company, and Django was pre-installed for me. :)

    But, I have installed Django on both Dreamhost and on Mac OS X — so if you can tell me what your platform is and exactly what problems you are having, I might be able to help.

  51. 051 // Branko // 05.08.2006 // 6:49 AM

    Ok, so your post got me interested in Django, I fiddled with the tutorials and I believe it will be adequate for most of my needs. But all of this is pointless if I can’t host it anywhere. Unfortunately, anywhere is limited to Croatia because clients don’t want to pay for a foreign host when we have a couple of them here. So I did some research and found out that most of the hosting companies here have Python installed. From the installation docs at the Django website I see that version 2.3 and above is required. mod_python never gets mentioned anywhere so I’ll have to ask about it. But is there anything other than that I should keep in mind when inquiring? Just to clarify, I’m talking about shared hosting.

  52. 052 // Bart // 05.09.2006 // 1:16 PM

    This is a good example of how to install on windows:

    http://www.thinkhole.org/wp/2006…

  53. 053 // Michael Halle // 05.09.2006 // 2:07 PM

    Great writing, and very helpful for extending the imaginations of both the Django and web communities!

    Do you think there’s any chance of releasing the Flickr integration code, either as an example on your site, or as a contribution on the djangoproject site?

    It would be useful both as a tool and as an example of how to interact with data from a remote source.

    Thanks.

  54. 054 // Nick Efford // 05.12.2006 // 8:33 AM

    Great work, Jeff! This is a fantastic advert for Django, and the sooner it gets out there for others to use, the better.

    Obviously, you are busy guys at World Online and won’t have a lot of time to spare for this - so perhaps the solution is to establish some kind of project incubation area at www.djangoproject.com, where a working prototype can be placed and then hacked on by the community?

    Think I might submit a ticket suggesting exactly that…

  55. 055 // Mihira Jayasekera // 05.16.2006 // 10:58 AM

    I am blown away by what you’re doing (and are able to do) with Django. I’d love to start playing with it but I have you beat in the non-programming department. Do you know of any absurdly simple instructions for getting Django installed on Mac OS X (10.4.6)?

    I’ve tried to follow the instructions Ben Atkins wrote on the official Django site wiki, and I’ve checked out Cavedoni’s instructions, but both of these assume a familiarity with the command line that I don’t have. I’m looking for the Django equivalent to Dan Benjanmin’s merciful instructions for installing Rails on OS X.

    (Sorry — I’m sure you’ve been inundated with Django questions over the past few weeks. Any help would be much appreciated!)

  56. 056 // Jeff Croft // 05.16.2006 // 11:01 AM

    Mihira-

    I have to be honest here — without any familiarity with the commond line a all, you’re going to stuggle with Django, I would think. After the installation you don’t need the commond line that much, but you’ll still need access it once in a while.

    I don’t think there’s any way to install Django on Mac OS X without the command line.

  57. 057 // Archatas // 05.17.2006 // 4:05 AM

    In my opinion, all code you wrote in this post is already programming. Of course, it is much easier than doing something with the same functionality from the scratch and it is of a higher level of coding, but it is still programming. So the right title for this post would be “Django for newbies” :)

  58. 058 // Jeff Croft // 05.17.2006 // 8:46 AM

    Of course it’s programming! I don’t believe I said anywhere that it wasn’t. The article is aimed at people who aren’t programmers, but that doesn’t imply that this isn’t programming at all.

  59. 059 // farlane // 05.18.2006 // 5:55 PM

    Me too!

    Fantastic post, sounds amazing, and thanks so much for taking the time to write about an environment that sounds very cool.

    Truthfully, your site is as potent an advertisement for the platform as this primer is.

    One question: Roughly how much of your site’s functionality (live comments, RSS feeds, etc) are part of the basic Django framework and how much are your own add-ins?

    I ask because I have rather a large and beastly site that I would like to tame.

  60. 060 // Jeff Croft // 05.18.2006 // 6:06 PM

    farlane:

    Really, most of my site is provided by the core Django framework. Comments and RSS are both provided and made very, very easy. The main thing that I wrote myself (and/or stole from jacob) is importers to import content from other sites (Flickr, delicious, etc.). Other than those importers, I’d say well over 90% of what I’ve done here is built-in Django components.

  61. 061 // farlane (aka Andrew McFarlane) // 05.19.2006 // 5:47 AM

    That’s great to hear, Jeff.

    Do you have any idea what sort of load Django places on a web server? My preferred host was asking about it and I couldn’t find anywhere where it had been addressed with my limited Google-fu. Thanks!

  62. 062 // Andy Hume // 05.19.2006 // 11:39 AM

    Nice write up Jeff.

    I’ve been messing about with Django on a dev server, but I think it might be an old version as some things seem slightly different to what you describe above - maybe it’s time to upgrade and start playing with this again.

    I’m just waiting for the right opportunity to use this for real.

  63. 063 // Jeff Croft // 05.19.2006 // 11:45 AM

    Andy, what differences are you seeing exactly? There has been some major refactoring recently, and I wrote the code above for the most recent version.

  64. 064 // Tom Bevington // 05.24.2006 // 3:39 PM

    Enjoyed your comments and site design. Was curious if your site has a PRINTABLE VERSION function button for those who might want to print selected pages, articles, etc. from your site directly to their printers. Did I miss it somewhere?

  65. 065 // Rune B // 05.29.2006 // 12:06 PM

    It looks like you have a small typo in your model. “pub_date = model.DateTimeField(‘?Date published’)” should be “pub_date = models.DateTimeField(‘?Date published’)”.

    Most important, great tutorial!

  66. 066 // shmuel // 06.02.2006 // 4:52 PM

    Rune B is correct. I ran into that typo as well. In addition to that typo there’s an error in the Tag Model you posted above.

    def __repr__(self):
        return self.name
    

    Should be:

    def __str__(self):
        return self.name
    

    This will make the admin interface behave correctly displaying the name of the tag in it’s admin widget instead of the non-descriptive ‘Tag Object’.

    Finally, when I cut/paste code from your code blocks all quotes are pasted as smart quotes which have to be changed to syntactically correct straight quotes. I’m assuming this is happening at the markdown level?

  67. 067 // Chris Abraham // 06.03.2006 // 8:37 AM

    How is this different from Zope or Plone?

  68. 068 // Jeff Croft // 06.03.2006 // 9:05 AM

    Chris-

    There are a lot of good comparisons between frameworks out there online. I’ve not used either Zope or Plone, so I’m no a very good person to ask.

  69. 069 // Jeff Croft // 06.03.2006 // 9:09 AM

    shmeul-

    You’re right. That’s me being used to pre-magic-removal Django and writing it the old way instead of the new. My bad.

    I’m assuming this is happening at the markdown level?”

    Actuallly at the SmartyPants level. It’s a bug, and I’m working on it.

  70. 070 // James Bennett // 06.03.2006 // 9:47 PM

    Chris, the main differences are that Django uses relational databases as opposed to the object-oriented ZODB, and Django’s learning curve is a whole lot lighter.

  71. 071 // Tom // 06.18.2006 // 8:22 PM

    I found a little spelling error: This, pub_date = model.DateTimeField('Date published')

    should be, pub_date = models.DateTimeField('Date published')

  72. 072 // hannu // 08.09.2006 // 6:27 AM

    I’m interested if you have made some modifications to the free comments system to accept and save email and url fields aswell, or are you using free comments at all? As far as I know (when there’s no official documentation available), free comments doesn’t allow to specify them by default.

    I need to have them in my blogging app aswell, and I thought of making some modifications to the model and views at /contrib/comments, but it went totally over my head.

    Oh, and thanks for the post. It’s what got me started playing with framework!

  73. 073 // Jeff Croft // 08.09.2006 // 9:02 AM

    I made a copy of the included FreeComments and then modified it to use the additional fields. This is less than ideal, but it gets me by until the comments app is re-written for Django 1.0.

  74. 074 // Gwen // 08.21.2006 // 2:26 AM

    I just want to say that I love your comment secton. If it checked spelling it would be perfect!

  75. 075 // Jeff Croft // 08.21.2006 // 2:40 AM

    Thanks Gwen! I wish there were a great way for me to check spelling in my comment forms, but that really is best done as a browser-side thing. I don’t think it will be long before all browsers have spell-checking in forms. Safari already does it, Firefox will in the next release — IE can’t be far behind (oh wait, yes it can).

  76. 076 // Warren // 08.30.2006 // 9:29 AM

    Thanks for the tips jeff they are great.

  77. 077 // Jason Nolen // 09.02.2006 // 1:24 AM

    Jeff, hey I’m new to the Django thing, the OS x thing, and pretty much everything. I’m installing Django on Os X 10.3.9, but first obviously had to get MySQL installed. When I use the package install for 10.3.9 and try to mysql -u root (initial login), i get an access denied error. root should have access without password on a fresh MySQL install no? I’ve looked all over for an answer with no avail. Any ideas? I’m installing MySQL 5.0.24

  78. 078 // Jeff Croft // 09.02.2006 // 1:42 AM

    Jason-

    I hope someone will be able to help you, but I’m afraid I don’t know the answer. I’ve only used PostgreSQL and SQLite on Mac OS X. :(

  79. 079 // Andy James // 09.03.2006 // 2:40 AM

    Jasson, access denial upon login to mysql ‘?u is most likely caused by the remaining of previous installation on the same root, so your next installation isn’t quite fresh to access mysql ‘?u root with no password. Try to delete any remaining of any previous installation before installing the fresh MySQL.

  80. 080 // Ru // 09.12.2006 // 2:47 PM

    Hi Jeff - I really liked your article and moreover your site its got alot of interesting and of use content.

    Actually read the django intro article & other resources about a month back, did the setup on dreamhost etcetera. I’m coming back to it now and have one question that maybe you or another poster can answer..?

    Perhaps I’m completely dumb on this - but I want to create say 70/80% of my project with django = fine.However I have other plugin modules like zenCart and phpBB that I would also like to sit on the same server - is this possible with the modRewrite and django setup? Is it a bad idea>?

    E.g I would have django powering news like /news/ but phpBB powering a forum loacated at /forum/ ?

    Hit me back someone!?

  81. 081 // Baxter // 09.12.2006 // 4:25 PM

    Ru, what you’re describing is no problem at all, so long as they’re standalone things that require no integration with your Django install. If you have to link them up, that get’s a little hairier, but if they’re on their own, then yes, just like you said, just add a line in htaccess to allow /forum/ through (just like the /media/ line). In fact, this is exactly what I’m doing while I figure out how I’m going to integrate punBB with Django.

  82. 082 // Ru // 09.13.2006 // 3:37 AM

    Baxter - cheers! Yeah that was my second question which I probably should have asked - can php scripts be called from django? Somewhat similar to php include()/require()… I guess thats what you mean is where it gets hairy..?

    Ideally I’d like to call some php scripts within my django templates - but I guess if the last solution is just to include dumped static files instead of database calling php then I can do that too..

  83. 083 // Jeff Croft // 09.13.2006 // 9:11 AM

    PHP scripts cannot be called from within Django. Although you could probably include a PHP file into your template with Django’s {% include %} or {% ssi %} template tags, Django/Python wouldn’t be able to parse the PHP contained in those files.

  84. 084 // Ru // 09.14.2006 // 6:28 AM

    @Baxter,Jeff - great thanks for your help guys.. :)

  85. 085 // Trevor Pierce // 09.15.2006 // 3:48 PM

    Jeff:

    Thank you for the straight-ahead tutorial on Django. I always thought I’d learn Ruby on Rails first, but the curve is steep. This might just be what I’m looking for, regarding a blogging app for my site. I like Wordpress, but I’m getting tired of hacking PHP files to create a custom theme. Here I may not have to.

    This article is inspiring to me as a designer first, wannabe programmer second. I’ll be using my first real framework in short order. Thanks for convincing me to give Python and Django a second look.

  86. 086 // Bret // 09.20.2006 // 3:51 PM

    Jeff-

    I’m sort of having trouble wrapping my head around how to break things up in a Django project. If I want to create a system were multiple authors can submit stories, do I first need to create an “authentication” app, then a “stories” app? Or do I create one overarching app that integrates the two? And can I shoehorn an authentication system after I get the stories sytem up and running? I guess I just don’t understand the best way to organize a Django project.

  87. 087 // Brad // 09.29.2006 // 10:19 PM

    I’m finally giving Django a shot but I’m finding good, easy to understand documentation a little hard to come by. For instance, I created a app with a class called posts and everything works great. Then I decided I wanted to add a new model to that class but I can’t seem to get the MySQL to update with the new models. Is there a commance to run to do this because I’ve tried ‘python manage.py sqlreset appname’ among many others but with no luck…

  88. 088 // Jeff Croft // 09.29.2006 // 11:38 PM

    Brad-

    python manage.py syncdb should do it.

  89. 089 // Brad // 09.30.2006 // 10:27 AM

    Yeah…I thought so to but it doesn’t seem to add the columns I add to my model to the database, which then gives me an ‘operational error’ when I try to view my ‘posts’ model through the admin….

  90. 090 // Jeff Croft // 09.30.2006 // 11:33 AM

    Oh, you’re trying to add columns to a pre-existing model? I get it now. Sorry I misunderstood.

    python manage.py sqlreset appname is what you want. But keep in mind that sqlreset doesn’t actually send the SQL to your database — it just prints it out to the screen (via STDOUT). So, you’ll want to pipe it to your database, like this (for MySQL)…

    python manage.py sqlreset appname | mysql -u username -p -h <a href="http://mysql.whatever.com" rel="nofollow">mysql.whatever.com</a> dbname

  91. 091 // Brad // 09.30.2006 // 5:54 PM

    Hum…I really wish there was an easier way. I guess I’ll just have to start really planning out my apps before I start writing them.

  92. 092 // Jeff Croft // 09.30.2006 // 9:36 PM

    Brad-

    A couple of points:

    1. This is only one command — it’s pretty easy!
    2. There is schema evolution project in progress that will make it even easier in the future.
    3. Yes, you should definitely plan out your models well before you start building.
  93. 093 // Andy Skogrand // 10.14.2006 // 6:02 PM

    I too have found Wordpress to be incredibly closed. Trying to add anything always feels like a hack. Then I came across this article, and I can see what Django has let you do with your amazing site, and now I’m converted. However, I am not a programmer and this stuff (initially) doesn’t come too easy to me. HTML, fine. CSS, surely. PHP I can only read and only if I know the context. I did the tutorials over at Django’s site, though I really wish there were some site that was dedicated to new users who need a strong helping hand. Also, there needs to be a place where beginner’s can post questions to a forum, because currently if you hit a wall, however small, you have to go ask “the big kids,” who are trying to work out much more tough questions themselves. So, all in all, I believe in Django, I just think it needs a way to reach a bigger audience. I’m a designer and I need this in order to make some of my website ideas reality.

  94. 094 // Guido Marc // 10.21.2006 // 9:50 AM

    Really a fantastic advert for Django, and the sooner it gets out there for others to use, the better.

  95. 095 // Pension // 10.22.2006 // 4:21 AM

    I`ve been using Wordpress for a long time, but it doesn’t exactly fit my needs for my site. Since I am familiar with both python and PHP, this has given me the incentive to have a look at Django.

  96. 096 // Lars // 10.22.2006 // 2:27 PM

    This is a great introduction into Django. Thanks alot for the information, Marc

  97. 097 // dale // 10.23.2006 // 11:30 PM

    jeff or anyone that knows the answer: I was following along with this tutorial on setting up a Posts section in the admin interface. After finally figuring out to including a few things in order for the Post class to work, I got the db to update and write the tables with model.py syncdb. Now, when i go to my admin interface, I still dont’ see anything for adding “Posts”, I only get Auth and Sites sections plus the history/latest actions column. What step am i missing in order to get the Posts section show up?

    thanks.

  98. 098 // Jeff Croft // 10.23.2006 // 11:40 PM

    Dale-

    It sounds like you probably don’t have your application listed under INSTALLED_APPS in your projects settings.py file.

  99. 099 // Dale // 10.24.2006 // 11:19 AM

    Jeff, I checked my INSTALLED_APPS in my settings.py file under “mysite” folder and this is what:

    INSTALLED_APPS = ( ‘django.contrib.auth’, ‘django.contrib.contenttypes’, ‘django.contrib.sessions’, ‘django.contrib.sites’, ‘django.contrib.admin’, ‘mysite.post’, )

    Is that the correct way to include the post apps? or should it be a different path similar to the ones above it? I’ll give it shot and see what happens, otherwise, not really sure where to turn on this one.

    thanks

  100. 100 // Jeff Croft // 10.24.2006 // 11:36 AM

    Dale…

    It should go like this:

    INSTALLED_APPS = (
        'projectname.appname',
    )
    

    So, if your project is called mysite and your app is called post, then yes — you’ve got it right. But I’m betting post is actually the name of your model, not the name of your app (maybe your app is called blog or similar?).

    As for where to turn, I would definitely recommend the official documentation. It’s very compelte and well-written. Here’s a link to the section on INSTALLED_APPS:

    http://www.djangoproject.com/doc…

  101. 101 // dale // 10.24.2006 // 1:47 PM

    thanks for your help jeff. my appname was actually post, but i switched it around so it was less confusing after your comment. is it necessary to use pkill python after doing a syncdb? I think someone said, or maybe it was even, that it was not necessary and that anything done after syncdb would take effect immediately.

    thanks

  102. 102 // Jeff Croft // 10.24.2006 // 2:02 PM

    Dale, that depends on your setup. Using Django’s built-in server, everything takes place immediately. Using Apache/mod_python, you need to reload Apache. Using FCGI, you can either pkill python or just touch your fcgi script. That’s how I do it on my Dreamhost FCGI setup, like this:

    touch ~/whatever.com/django.fcgi
    
  103. 103 // bg // 10.25.2006 // 2:07 PM

    Hi Jeff,

    I am in the process of researching weblog software written in Python that will integrate well within the Django framework. Do you have any recommendations? Your blog is great, what are you using? Thanking you in advance. BG

  104. 104 // Jeff Croft // 10.25.2006 // 2:19 PM

    bg-

    I don’t personally know much about Python blogging software. I wrote my own using Django, and this seems to be the tact of most Django-based developers I know of — you can litteratly write a basic blogging an with Django in 30 minutes, so I think this keeps most folks from using pre-canned blogging packages.

  105. 105 // Rahul // 11.02.2006 // 11:18 PM

    Hi jeff, we are using django for our application ,its seems to be very good python framwork , but can we use Name based hosting with Django.?If yes how? thanks in advance.

  106. 106 // Alex J. // 11.10.2006 // 1:33 AM

    Great post. Now I’m looking for framework application. I will try Django. Merci, Jeff

  107. 107 // Rechtsanwalt // 11.21.2006 // 4:30 PM

    Textmate was a really good tip to work with the syntax, i´m using it for now 4 weeks and the syntax coloring is great…

  108. 108 // Tuning Andy // 11.24.2006 // 12:18 PM

    Really a good instruction into django, i ´m looking for a good framework for a long time, i will have a look at the django sites mentioned here…

  109. 109 // Charly // 11.28.2006 // 12:48 PM

    I will like to know if it´s works OK?.

  110. 110 // Logodesign // 12.03.2006 // 11:10 PM

    I hope someone will be able to help you, but I am afraid I don’t know the answer. I have only used PostgreSQL and SQLite on Mac OS X.

  111. 111 // pythonless idiot attempt django // 12.24.2006 // 9:36 PM

    I think this will break:

    search_fields = (‘title’, ‘slug’, ‘body’)

    I had to use

    search_fields = [‘title’, ‘slug’, ‘body’]

    Why?? I don’t know python but I think Jeff made a syntax error in the example :-P

  112. 112 // Chris Vincent // 01.06.2007 // 9:17 PM

    Very nice write-up. I’ve been using PHP for 5 years and have written several frameworks of my own. Just recently, I switched somewhat reluctantly to Ruby on Rails because some of the features of the Ruby language (which is more similar to Python than it is different) were so very tasty but really couldn’t be ported to PHP. However, I feel that RoR has strayed from the path of the good and righteous as of late—writing JavaScript in Ruby is a terrible idea IMNSHO, and the framework’s ties to Prototype and Scriptaculous are a bit overbearing, to cite two examples. Django’s “non-magical” approach fits me better too, because it is in my nature to want to know how it’s doing what it’s doing, whether I really need that information to use it or not, so that if I want to make some changes or extensions I can do so without breaking consistency with the rest of the framework (extending RoR the “right” way almost always involved journeys into undocumented source that was anything but trivial to piece together). Plus, as another article about Django said, Django doesn’t come preloaded with DHH, RoR’s brilliant but overzealous creator. :) With Django, I can code without feeling like I’m working for his church.

    And Python is just as good as Ruby as far as I’m concerned. Sure, they have a few different philosophies, but when it comes to actually coding something that works, these differences very rarely end up affecting the end solution. (I learned Python long before I learned Ruby, and I don’t see why the two camps hold such malice for one another.)

  113. 113 // Jeff Croft // 01.07.2007 // 4:05 PM

    @pythonless idiot attempt django: You found a difference between pre-magic remove and post-magic removal Django. I suspect you were using post-magic removal, werheas my example was written for pre-magic removal.

    Anyhow, the difference in the syntax is that () indicates a tuple, whereas [] indicates a list — two difference Python data types.

    @Chris: Nice comment. I also don’t quite get the malice between the two camps, as (like you said) Python and Ruby seem to have a lot more in common than they do differences.

  114. 114 // Brian // 01.17.2007 // 11:14 PM

    Comment #93 looks like some major spam, might want to get that yanked… wouldn’t want to help them out with that major Jeff Croft google juice.

    Also, in the model definition above notice:

    pub_date = model.DateTimeField(‘Date published’)

    Should be models.DateTimeField instead.

  115. 115 // Jeff Croft // 01.18.2007 // 1:23 AM

    Thanks, Brian. Fixed, and fixed.

  116. 116 // max // 02.11.2007 // 11:12 AM

    Thanks for the post. Actually i’d like to hear some more abour slug urls in django

  117. 117 // Vorwahlen // 03.02.2007 // 8:48 AM

    great! now i know what django is ;-P

  118. 118 // Versand // 03.02.2007 // 5:50 PM

    Great, thank you for this django knowledge!

  119. 119 // Doug // 05.03.2007 // 9:19 PM

    Excellent post, it makes me want to play with Django. I remember I installed on my server some time ago but didn’t know how to start with it. This is the kind of tutorial that every application needs. A question, did you add xml-rpc support to it, I’ve found editing on a blog editor to be much more convenient than editing on a web based interface.

    Thanks,

  120. 120 // Jeff Croft // 05.03.2007 // 9:40 PM

    @Doug: I didn’t do the XML-RPC stuff, because I just don’t need it. But, I do know people who have. Not sure how hard it is, but I know it can be done! :)

  121. 121 // Jeff Croft // 05.30.2007 // 8:15 AM

    I’m using Pygments, the Python syntax-coloring library to generate the HTML for my code snippets, and then using CSS to style that HTML.

  122. 122 // Jeremy Ricketts // 05.30.2007 // 12:03 PM

    So here’s my own take on all of this…

    I’ve been doing design/markup for a couple years now. I’m just starting to explore programming. As a designer, programming seems like pretty scary stuff. But there are some projects I have in mind, and some jobs I have had to pass up, that require a bit (or a lot) more than what an out-of-the-box CMS will handle. I know I need to jump in and do some programming at this point, but there’s a lot of questions spanning some pretty broad topics like… which language? OOM/MVC? Should I use a framework? If so which? What is one of these summer projects “pops off” and I find myself needing to do some serious scaling of my app?

    I’ve settled on using a framework namely because I feel it’s a bit like bumper-bowling or training wheels- it will help enforce some basic practices as I try my hand at programming. Which framework though?

  123. 123 // Jeremy Ricketts // 05.30.2007 // 12:04 PM

    It seems the main contenders on the web these days are Code Igniter (php), CakePhp, RoR, Django. I watch some screencasts, read some blogs, and come up with this conclusion:

    PHP frameworks: Snook is into CakePHP… but other than that I can’t see a whole lot of momentum behind it all. Also, as a complete novice looking at code, Python looks pretty intelligible, Ruby looks like Dr. Suess simple, and PHP just looks nasty-ass. Maybe that’s shouldn’t be a huge consideration but PHP is like the fat kid at the school dance… maybe they’re really nice once you look past skin.

    Django: Pro- It’s in Python and if Python is good enough for Google, then it’s good enough for me. The generated admin screens are just plain hawt. I read Bryan Veloso’s post on Django and was pretty impressed by it all. Con- People seem to have some difficulty setting it up. There also seems to be a lack of documentation across the web (i.e. this post you have made is like a diamond in the rough it seems). There’s not many books on the shelves about it. Scary.

    RoR: Pro- I can’t take two steps on the web without tripping over RoR tutorials and documentation. There’s plenty of books on the shelf. Setting up a mongrel server, installing gems, updating is all pretty much a no brainer (at least for me- I had it up and running in less than an hour and I’m pretty new to all of this). The community seems fairly large. Cons- The big “Does Rails Scale?” question keeps ringing in my ears. (Discussions of Twitter are a little hollow for me… they handle over 11k requests per second I believe and it’s amazing that their servers haven’t gone up in smoke). Also, RoR is so “buzzy” it’s annoying. (OMG u can build the next MySpace in like 8 linez of code. lol roflcopter. maybe we can call it AgileSpace(beta)

    So… that’s my take on all of this as a lowly designer with aspirations of doing a bit of programming this summer. My opinions on these matters seem to change every couple weeks, so I don’t hold fast to any of these assumptions. This is what the landscape looks like for an “outsider” trying to make heads-or-tails of all of this.

  124. 124 // Jeff Croft // 05.30.2007 // 1:09 PM

    Jeremy, I generally agree with your assessment, but I do have to take issue with the idea that there’s no much documention for Django on the web. The official documentation is far better than most open source projects, and there’s an entire freely available book for your consumption. I’d personally rather have a free book written by the creators of Django than all the overpriced Rails books you have to go to a store and buy!

    Aside from that, I do basically agree. There’s not much reason to get into PHP now, I don’t think. If you are already a PHP expert, then by all means give Cake a look — but if you’re going to learn a language, Python and Ruby are obviously where the momentum is.

    Rails sacling is definitely an issue. Ruby is painfully slow compared to Python, and until Ruby is faster, I don’t see how Rails can ever compete with Django on pure performance. I do believe the Ruby camp is working on this, though. Of course, pure performance may not matter for smaller sites — but it’s still something to think about.

    The buzz around Rails is indeed annoying, but that’s no reason not to choose it. It’s a good framework with a lot of good people behind it.

  125. 125 // Jeff Croft // 05.30.2007 // 1:46 PM

    What I mean by documentation, is the “collective” documentation on the web, not just the official documentation.

    Okay, but I would counter by asking you this: how many different sources for documentation do you need? Do you really need a whole bunch of different sources? Isn’t one or two really good sources at least as effective as lots of mediocre sources?

    People sometimes say Django isn’t offered on that many web hosts, and I ask the same question: how many web hosts do you need? Don’t you really just need one good one? Who cares if PHP is on 1,000,000 web hosts and Django is only on 100. I only need one. :)

  126. 126 // Jeremy Ricketts // 05.30.2007 // 4:29 PM

    I can’t speak for everyone, but I know when I attempt something new (especially something new and highly technical) I find that different samples, approaches, and voices can help tremendously. In general, I think you’re right though- one great resource is usually better than 5 half-ass resources.

    When facing an obscure problem or tackling a more specialized operation, sometimes you have to go beyond the Official Documentation. Then finding an answer often depends on your ability to sift through all the half-ass information out there and/or how large the user-base is (increasing the chance that someone out there has conquered the same problem or is at least smarter than you).

    I have found myself in that situation a lot, even with CSS and html.

    Side Note: I appreciate this dialog and hope I don’t sound to argumentative. I’m looking forward to installing and learning Django. My hope is that this feedback is valuable as I kinda consider myself the “target market” for web frameworks like Django, RoR, etc.

  127. 127 // Jeff Croft // 05.30.2007 // 4:48 PM

    I appreciate this dialog and hope I don’t sound to argumentative. I’m looking forward to installing and learning Django. My hope is that this feedback is valuable as I kinda consider myself the “target market” for web frameworks like Django, RoR, etc.

    Oh, I don’t think it’s argumentative at all. Don’t worry about that. :) Do keep in mind, too, that I am not a member of the Django team, so the feedback might be more useful to them than me!

    Also, don’t forget about the other “official” channels for Django help: dango-users on Google groups and #django on Freenode IRC. Both have been really helpful to me!

  128. 128 // Chris // 06.28.2007 // 5:45 AM

    It’s too late now for me to change my CMS now. BUT I will build my next (small) project with DJANGO. Thanks for that intro, it fits perfectly.

  129. 129 // Alexander Radsby // 07.04.2007 // 1:48 PM

    Thanks a lot, I really really mean it. I think I love you.

    This answerers all my questions about Django that I’ve been looking for. As soon as Media Temple fix the Django container then I’m set.

    Thanks again!

  130. 130 // django lover // 08.01.2007 // 10:37 PM

    Even one year after, this is a great post worth reading

  131. 131 // Maxomat // 08.20.2007 // 1:29 PM

    Great!

  132. 132 // owl // 09.19.2007 // 10:27 PM

    Thanks for the tips jeff they are very useful

  133. 133 // Lou Quillio // 10.28.2007 // 6:01 PM

    Jeff, may I ask what you’re using for syntax colorizing?

    Also, python-markdown tracks Gruber’s markdown.pl, as I understand things. Michel Fortin’s extensions are more feature-complete, and will certainly find their way into Markdown when Gruber gets around to it. Are you getting by with standard Markdown, or is there more good Markdown stuff in Python-land than I’ve found?

    Thanks.

    LQ

  134. 134 // Peter Pistorius // 01.16.2008 // 10:28 AM

    I really like Django as well… My main problem is the large file upload bug. All files that are uploaded into Django are uploaded into memory instead of a temporary file.

    The ticket[1] is more than 2 years old and the patches aren’t working for me.

    [1] http://code.djangoproject.com/ti…

  135. 135 // PerSound // 02.17.2008 // 6:37 PM

    Django perfect designer! I am look for them.

  136. 136 // gowner // 02.23.2008 // 4:24 AM

    Erik: Do you mind telling me how you went about doing the createsuperuser and init manually? I’ve been trying to work it out for a while now, to no avail.

  137. 137 // Spirit69 // 03.16.2008 // 3:44 PM

    Great, thank you for this django knowledge!

  138. 138 // Richard // 04.07.2008 // 9:20 PM

    Would you mind also sharing your Tag model? It would be instructive to really see how ManyToMany works.

  139. 139 // Jonn // 04.15.2008 // 7:16 AM

    In my opinion wordpress- is the best cms for non- programmers But when I will have a free time I will test Django

  140. 140 // map // 04.18.2008 // 8:39 AM

    http://shemalesclub.nm.ru/map.html http://gay-film.nm.ru/map.html http://gayporno-free.nm.ru/map.html http://gay-club.nm.ru/map.html

  141. 141 // doncarlos // 04.30.2008 // 7:40 AM

    How does this compare with other programmes for downloading mp3 tracks faster and with better quality? http://allemusik.net

  142. 142 // Davi Lima // 07.02.2008 // 9:30 AM

    http://static.jeffcroft.com/img/…

    Images are non-working in this blog post.

  143. 143 // pab // 10.03.2008 // 12:44 PM

    I’m so glad I came across this article, I’ve been using wordpress and Ez-publish for most of the sites I build and was looking for something that was more solid and designer friendly

    Your article totally sold me on Django,

    Well done sir, well done.

    PS I wish I saw this when it first came out…

  144. 144 // JPLodine // 10.30.2008 // 11:18 AM

    Wonderful post, even 2+ years later it’s full of useful information. Very helpful, and the opinions expressed are balanced and fair.

    Note: one unfortunate spam entry has crept in at #140.

  145. 145 // sundar raman // 12.13.2008 // 11:26 AM

    I have problem in my hosting.I hosted my site in dreamhost server. The url is http://www.csmit.org I hosted the content which works well in my local server. Now the images in the website failed to load as well as the javascript file. Can anyone plz help me..

  146. 146 // eu-fuehrerschein // 12.16.2008 // 2:26 AM

    differences are you seeing exactly?

  147. 147 // wwwcar // 01.01.2009 // 5:32 AM

    What ever you said is absolutely true! thanks for your info…

  148. 148 // Kitchen Design // 01.06.2009 // 7:44 AM

    Thanks for the tips jeff they are very useful

  149. 149 // Life Design SEO // 01.12.2009 // 2:31 AM

    I’m a big believer in Django, thanks Jeff for the great resource!

  150. 150 // gmat // 01.16.2009 // 3:27 AM

    I’m a big believer in Django too, thank u r the best

  151. 151 // chattr // 01.24.2009 // 5:57 AM

    hi thank you for sharing the information

  152. 152 // Scion TC Body Kits // 01.28.2009 // 8:51 AM

    Smashing stuff..Need of the hour information this one..

  153. 153 // Laurence // 03.17.2009 // 7:32 AM

    Hi, thanks a lot for sharing all this information

  154. 154 // Tyler // 05.19.2009 // 7:15 AM

    I found this site while searching on Django. I have been using PHP based CMS and blogs for years now, and I jsut can’t find what I really need. Everything is too bloated with programs I don’t need, or the code is written for one specific type of program (blog, gallery, forum, etc.) and it cannot be modified other than the one who wrote it. Then you get into the problem of differnet versions, updates, etc that do not go with the add ons you have installed, and you either crash the site or have to use old dated security vulnerable updates.

    I am seriously looking into Django as an alternative.

  155. 155 // internetmarketingbybreeze // 05.22.2009 // 10 AM

    Found this post when googling “Django”. My curiosity was piqued a few weeks ago but like most was put off by the possible complexities and having to learn tey another way of doing things. I’ve been stuck on wordpress for ages but your explanation on Django really has made things a lot clearer. Thanks for the great post :)

  156. 156 // Wrobincobre // 07.06.2009 // 11:28 AM

    There is a lot of talking about M. Jacksondead, it’s a ery sad for me because I love his msuic, IU still didn’t belieev in his dead. Hi was a dfinitely king of ‘Pop’.

  157. 157 // Schoschie // 08.18.2009 // 5:41 AM

    Hi Jeff,

    thanks for this introduction. I’ve been wanting to try out Django for years. It takes a lot of energy to get off the PHP wheel which has a lot of momentum.

    You might want to check your comments on this page: It appears comments 140, 141, 146-153 and 156 are all spam (non-specific one-liners with a link to some random site).

    Also, as has been noted in #142, the inline images on this page no longer work.

    Niels

  158. 158 // Aeromoensueno // 11.04.2009 // 2:36 PM

    and a severe bout of influenza, and was seen locking The Killers Mr Brightside to have fun now. Peter Bjorn and John Young Folks (Diplo remix) recently ended - Chris Brown featuring T-Pain Kiss Kiss Guy Ritchie, Naomi Watts, Lisa Snowdon, Hard-Fi Suburban Knights romance with Samantha Justice vs Simian We are Your Friends but his condition Razorlight Slipway Fires chase me in their vehicle.’ Kat Deluna featuring Elephant Man Whine Up a raunchy dance for him Fedde Le Grand and Funkerman 3 Minutes to Explain having severe coughing bouts, Mgmt Kids ‘He is recovering Bodyrox featuring Luciana What Planet You on (including Martijn Ten Velden remix) to have fun now. Various Artists Promo Only Dance radio July bacterial infection E.Coli Manuel de la Mare Born Slippy that their continued Clash Rock the Casbah and a severe bout of influenza, and Paul Van Dyk In Between 100 yards away Guru Josh Project Infinity 2008 (including Klaas remix) who is dating Various Artists Slumdog Millionaire A statement filed by Nicole – Timo Maas Subtellite been ill for two weeks, MC Hammer Please Hammer Don’t Hurt Them who was recently romantically Britney Spears Gimme More ‘The feeling is Dizzee Rascal Flex of the weekend Adam K and Soha Come to Me (Twilight) I think about the break-up. Robin S Show Me Love Good Charlotte rocker Sei A Smile for Me car which hit Nicole’s, Soulja Boy Crank that (Soulja Boy) chase me in their vehicle.’ Kaskade and Deadmau5 Move for Me I just want Various Artists Debbie Downer (Wheres Mr Brown) getting better after contracting INXS Definitive chase me in their vehicle.’ Alex Young and Artech Minimalesk I feel like Thomas Schumacher Picanha six weeks. Chris Lake and Deadmau5 I Thought Inside out download music Sarah Brightman Time to Say Goodbye was over for good and she was out to enjoy herself. Vanity 6 Vanity 6 but his condition Chris Lake The One EP a longer period. Dave Spoon featuring Lisa Maffia Bad Girl crashed into her vehicle – Wyclef Jean Sweetest Girl featuring Akon Lil Wayne and Niia old star is Steve Angello vs Laidback Luke Be-(Bitch1mm) online mp3 charts Reflekt Need to Feel Loved (Adam K and Soha mixes) lips with the handsome actor after performing Zya and Bada The Way I are to reassure fans of their idol’s health. ‘He doesn’t like letting .

  159. 159 // screamerct // 11.06.2009 // 11:22 PM

    What’s up? Bored between classes here so decided to introduce myself.

    Umm so like does anyone know how to unblock myspace at school?

  160. 160 // ZOMarco // 11.14.2009 // 10:06 PM

    What’s up?

  161. 161 // video // 11.30.2009 // 4:58 AM

    very nice thanks

  162. 162 // Alligator Shoes // 12.07.2009 // 3:18 AM

    Then you get into the problem of differnet versions, updates, etc that do not go with the add ons you have installed, and you either crash the site or have to use old dated security vulnerable updates.

  163. 163 // External hard drive // 12.14.2009 // 12:57 PM

    For us non-programmers, Django provides built-in views (called “generic views”) that cover about 90% of everything you’ll ever want to do. Almost all of jeffcroft.com is done with generic views. Without writing a single line of code, you get: To me Django looks complicated.

  164. 164 // gipputerist // 12.19.2009 // 12:47 PM

    ?????????? 4-?? A B C D ??????? ???????? ?????? ?? ???? 2009.
    Wecks 45-48 III s\l 230 t\p 465ps III B\H 2x3 63ps III 1) 270ps III 2) 790ps
    Wecks 40-45 III s\l 230 t\p 920ps III B\H 3x3 180ps III 1) 945ps III 2) 1173ps
    Weeks 35-40 III s\l 230 t\p 438ps III B\H 3x6 -362ps III 1) 380ps III 2) -1097ps
    Weeks 30-35 III s\l 230 t\p -26ps III B\H 8x4 332ps III 1) -26ps III 2) -215ps
    Weeks 25-30 III s\l 230 t\p 629ps III B\H 6x1 518ps III 1) 693ps III 2) 606ps
    Weeks 20-25 III s\l 230 t\p 377ps III B\H 6x6 772ps III 1) 453ps III 2) 1293ps Weeks 15-20 III s\l 230 t\p 756ps III B\H 5x3 203ps III 1) 682ps III 2) -230ps
    Weeks 10-15 III s\l 230 t\p 771ps III B\H 6x5 110ps III 1) 689ps III 2) 540ps
    Weeks 05-10 III s\l 230 t\p -613ps III B\H 3x0 -756ps III 1) -730ps III 2) -233ps
    Weeks 01-05 III s\l 230 t\p -401ps III B\H 7x2 874ps III 1)-1412ps III 2)-1199ps
    ??????????? ?????? III 138x-103 III 49x-43 III 136x-105 III 127x-114
    ????? ????????? $ III 3316ps\ lot % III 1934ps\ lot % III 1944ps III 162ps ????????? ?????? ????????? ?????, ????? ?????? ??????, ? ???? ???????????? 300-500% ???????, ?????????? ?? 3 ?????? ? ????. ??????????? ????????????? ?????? ?? ?????, ?????? ?? ?????, ?????? ????? ???????. ????????? ? ????? “???????? ??????.doc” ?????? _www.regulest.ru\regulest.rar ??? _www.regulest.ru\System.doc ??????? ???? ?????? ???? ????? ????????, ??? ??????? ??? ???, ? ???????? ???????????? ???????? ?????. ?? ???? ??????, ???? ???????, ???? ????? _http://www.regulest.ru/forex%20forum/index.php?board=2.0 ? ?????????.

  165. 165 // Dauncanty // 12.26.2009 // 2:52 AM

    hardcore teen lesbian porn asian model lesbians lesbian and straight women affair with lesbian amateur college lesbian pictures lesbian captive busty asian lesbian pics

  166. 166 // justanotherdayatthebeach // 12.28.2009 // 8:11 AM

    Hello. I am new to the forum. I wanted to see if you would share your ideas with me about why you choose this forum over others. I guess I just want to make sure that this is the best forum so I do not waste my time. I am looking forward to your suggestions.


    [url=html://www.menssandals.biz]mens sandals[/url] make my feet feel fine in the sand

  167. 167 // omercoskun // 01.06.2010 // 9:47 PM

    Scuderia Ferrari unveiled today at the Maranello headquarters its new simulator. The ceremony took place in the structure built to accommodate the new machine, within the Gestione Sportiva, in the presence of Ferrari CEO, Amedeo Felisa and the Scuderia Team Principal, Stefano Domenicali, [url=http://www.omercoskun.org]Ömer Coşkun[/url]. “It’s an important day for us as the completion of this project means [url=http://www.omercoskun.org]Ömer Coşkun Formula 21[/url] we will now be able to tackle with confidence some of the challenges that make up modern-day Formula 1, while putting Ferrari at the cutting edge in terms of this technology,” said Domenicali during the ceremony. “Furthermore, I am pleased that such a complex project as this, which got underway around two years ago, has been completed on schedule thanks to the efforts of all those who worked on it,” he added. Andrea Bertolini, the man who worked with the Ferrari engineers on the development [url=http://www.omercoskun.org]Ömer Coşkun[/url] of the project, was the first to test the new simulator, having gained a great deal of experience over the past few years, working on the simulator at the FIAT Research Centre. The Ferrari simulator, built with the technical support of Moog, consists of an aluminium and composite structure in which are fitted the cockpit and the equipment which produces the images and sound. The platform weighs around two tonnes and is fitted with electronically controlled actuators that way around half a tonne each. The whole structure is fitted on a specially designed and built base, weighing two hundred tons. The whole is controlled by ten multiprocessor calculators with a total memory of over 60 GB of RAM: the amount of data that can be produced is around 5GB per day. It features a Dolby Surround 7.1 sound system, putting out 3500 W. The installation required over ten kilometres of cabling and power output is around 130 kW. The simulator is housed in a building measuring around 180 square metres, on two floors, which includes the control room. The platform covers a surface area of around eight metres wide by the same length and is six metres high. The driver is [url=http://www.omercoskun.org]Ömer Coşkun[/url] installed in front of five displays, which give a total viewing angle in excess of 180°.

  168. 168 // Dirk // 01.07.2010 // 1:28 AM

    Thanks a lot for all the good stuff an information.

    Greeting from Germany

    Dirk

  169. 169 // Dirk // 01.07.2010 // 1:29 AM

    Thanks a lot for all the good stuff an information.

    Greetings from Germany

    Dirk

  170. 170 // Dirk // 01.07.2010 // 1:33 AM

    Thanks for the good stuff and information.

    Greetings from Germany

  171. 171 // Dirk // 01.07.2010 // 1:33 AM

    Thanks for the good stuff and information.

    Greetings from Germany

  172. 172 // Resveratrol Health Benefits // 01.11.2010 // 6:19 AM

    I’ve never used python, but your code looks simple and fairly straight forward, I might just try it out

  173. 173 // orumcekstand // 01.27.2010 // 7:10 PM

    What google [url=http://www.grafikit.com]Stand[/url] for?

    Google is one of the most popular brands on the Internet and this was proved by the numerous surveys conducted by the research companies. Because it is so famous, most of the Internet users are frequently talking about it just like about a person. But have you ever asked yourselves what Google means

    or at least where the Google term comes from? Well, Dictionary.com, one of the most popular web-based dictionaries defines Google as “a trademark used for an Internet search engine. This trademark often occurs in print as a verb, sometimes in lowercase.”

    But still no definition of the world. According to the Google guys, the company’s name [url=http://www.grafikit.com]Örümcek Stand[/url] comes from the word ‘googol’ which is actually a number invented by Milton Sirotta. Probably the Google name is related to the number of the results provided by the search technology which is usually huge.

    The name ‘Google’ is a play on the word ‘googol,’ coined by Milton Sirotta, nephew of American [url=http://www.rollup.gen.tr]Rollup[/url] mathematician Edward Kasner. A ‘googol’ refers to the number represented by a 1 followed by 100 zeros. It’s a very large number. In fact, there isn’t a googol of anything in the universe — not stars, not dust particles, not atoms. Google’s use of the term reflects our mission to organize the world’s immense (seemingly infinite) amount of information and make it universally accessible and useful,” Google tried to explain the origins of the company’s name.

    Because it is a company name [url=http://www.grafikit.com]Örümcek Stand[/url], Google is a noun. Logically. However, slowly but sure, it evolves and tends to become a verb as numerous users refer to the act of searching the Internet as “googling”. For example, I heard some friends saying “I’m going to Google it,” meaning that they will search the Internet using the Google search engine.

  174. 174 // MowBronsmon // 02.01.2010 // 1:02 PM

    Hey I was browsing this forum and I thought I would share with you all a recent find of mine: This is a great [url=http://www.girlsteachguys.com/PlayVideo.aspx?LiveClip=285] [b]Sex Tips Video[/b][/url] site, It’s 100% free to join and use, and has some of the best videos I have seen on [url=http://www.girlsteachguys.com][b]Sex Positions[/b][/url] ,foreplay, Sex Toys etc. It’s like the Wikipedia of sex, but It’s not dirty or anything, plus: you can ask the people who made the Clips questions, (also regular users can interact) Hope this helps folks out here

    Let Me know what you think

Tags for this entry
Links in this entry