0% found this document useful (0 votes)
36 views

3 Steps For Creating Model in Django

Uploaded by

mirej59494
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
36 views

3 Steps For Creating Model in Django

Uploaded by

mirej59494
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 26

3.

Steps for creating Django Model


Django Requires Python
To check if your system has Python installed, run this command in the
command prompt:

python --version

If Python is installed, you will get a result with the version number, like this

Python 3.9.2

If you find that you do not have Python installed on your computer, then you
can download it for free from the following website: https://www.python.org/

PIP
To install Django, you must use a package manager like PIP, which is
included in Python from version 3.4.

To check if your system has PIP installed, run this command in the command
prompt:

pip --version

If PIP is installed, you will get a result with the version number.

For me, on a windows machine, the result looks like this:

pip 20.2.3 from c:\python39\lib\site-packages\pip (python 3.9)

If you do not have PIP installed, you can download and install it from this
page: https://pypi.org/project/pip/

Virtual Environment
It is suggested to have a dedicated virtual environment for each Django
project

1|Page
nd one way to manage a virtual environment is venv, which is included in
Python.

The name of the virtual environment is your choice, in this tutorial we will
call it myworld.

Type the following in the command prompt, remember to navigate to where


you want to create your project:

Windows:

py -m venv myworld

Unix/MacOS:

python -m venv myworld

This will set up a virtual environment, and create a folder named "myworld"
with subfolders and files, like this:

myworld
Include
Lib
Scripts
pyvenv.cfg

Then you have to activate the environment, by typing this command:

Windows:

myworld\Scripts\activate.bat

Unix/MacOS:

source myworld/bin/activate

Once the environment is activated, you will see this result in the command
prompt:

Windows:

(myworld) C:\Users\Your Name>

Unix/MacOS:

(myworld) ... $
Note: You must activate the virtual environment every time you open the
command prompt to work on your project.

2|Page
Install Django
Now, that we have created a virtual environment, we are ready to install
Django.

Note: Remember to install Django while you are in the virtual environment!

Django is installed using pip, with this command:

Windows:

(myworld) C:\Users\Your Name>py -m pip install Django

Unix/MacOS:

(myworld) ... $ python -m pip install Django

Which will give a result that looks like this (at least on my Windows
machine):

Collecting Django
Downloading Django-4.0.3-py3-none-any.whl (8.0 MB)
|████████████████████████████████| 8.0 MB 2.2 MB/s
Collecting sqlparse>=0.2.2
Using cached sqlparse-0.4.2-py3-none-any.whl (42 kB)
Collecting asgiref<4,>=3.4.1
Downloading asgiref-3.5.0-py3-none-any.whl (22 kB)
Collecting tzdata; sys_platform == "win32"
Downloading tzdata-2021.5-py2.py3-none-any.whl (339 kB)
|████████████████████████████████| 339 kB 6.4 MB/s
Installing collected packages: sqlparse, asgiref, tzdata, Django
Successfully installed Django-4.0.3 asgiref-3.5.0 sqlparse-0.4.2
tzdata-2021.5
WARNING: You are using pip version 20.2.3; however, version 22.3 is
available.
You should consider upgrading via the 'C:\Users\Your
Name\myworld\Scripts\python.exe -m pip install --upgrade pip' command.

That's it! Now you have installed Django in your new project, running in a
virtual environment!

Windows, Mac, or Unix?


3|Page
You can run this project on either one. There are some small differences, like
when writing commands in the command prompt, Windows uses py as the
first word in the command line, while Unix and MacOS use python:

Windows:

py --version

Unix/MacOS:

python --version

In the rest of this tutorial, we will be using the Windows command.

Check Django Version


You can check if Django is installed by asking for its version number like this:

(myworld) C:\Users\Your Name>django-admin --version

If Django is installed, you will get a result with the version number:

4.1.2

Django Create Project


My First Project
Once you have come up with a suitable name for your Django project, like
mine: my_tennis_club, navigate to where in the file system you want to store
the code (in the virtual environment), I will navigate to the myworld folder,
and run this command in the command prompt:

django-admin startproject my_tennis_club

Django creates a my_tennis_club folder on my computer, with this content:

my_tennis_club
manage.py
my_tennis_club/

4|Page
__init__.py
asgi.py
settings.py
urls.py
wsgi.py

These are all files and folders with a specific meaning, you will learn about
some of them later in this tutorial, but for now, it is more important to know
that this is the location of your project, and that you can start building
applications in it.

Run the Django Project


Now that you have a Django project, you can run it, and see what it looks
like in a browser.

Navigate to the /my_tennis_club folder and execute this command in the


command prompt:

py manage.py runserver

Which will produce this result:

Watching for file changes with StatReloader


Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly
until you apply the migrations for app(s): admin, auth, contenttypes,
sessions.
Run 'python manage.py migrate' to apply them.
October 27, 2022 - 13:03:14
Django version 4.1.2, using settings 'my_tennis_club.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Open a new browser window and type 127.0.0.1:8000 in the address bar.

The result:

5|Page
Django Create App
What is an App?
An app is a web application that has a specific meaning in your project, like a
home page, a contact form, or a members database.

In this tutorial we will create an app that allows us to list and register
members in a database.

But first, let's just create a simple Django app that displays "Hello World!".

Create App
I will name my app members.

Start by navigating to the selected location where you want to store the app,
in my case the my_tennis_club folder, and run the command below.

6|Page
If the server is still running, and you are not able to write commands, press
[CTRL] [BREAK], or [CTRL] [C] to stop the server and you should be back in
the virtual environment.

py manage.py startapp members

Django creates a folder named members in my project, with this content:

my_tennis_club
manage.py
my_tennis_club/
members/
migrations/
__init__.py
__init__.py
admin.py
apps.py
models.py
tests.py
views.py

These are all files and folders with a specific meaning. You will learn about
most of them later in this tutorial.

First, take a look at the file called views.py.

This is where we gather the information we need to send back a proper


response.

Django Views
Views
Django views are Python functions that takes http requests and returns http
response, like HTML documents.

A web page that uses Django is full of views with different tasks and
missions.

Views are usually put in a file called views.py located on your app's folder.

There is a views.py in your members folder that looks like this:

my_tennis_club/members/views.py:

from django.shortcuts import render

7|Page
# Create your views here.

Find it and open it, and replace the content with this:

my_tennis_club/members/views.py:

from django.shortcuts import render

from django.http import HttpResponse

def members(request):

return HttpResponse("Hello world!")

Note: The name of the view does not have to be the same as the
application.

I call it members because I think it fits well in this context.

This is a simple example on how to send a response back to the browser.

Django URLs
Create a file named urls.py in the same folder as the views.py file, and type
this code in it:

my_tennis_club/members/urls.py:

from django.urls import path

from . import views

urlpatterns = [

path('members/', views.members, name='members'),

8|Page
The urls.py file you just created is specific for the members application. We
have to do some routing in the root directory my_tennis_club as well. This may
seem complicated, but for now, just follow the instructions below.

There is a file called urls.py on the my_tennis_club folder, open that file and
add the include module in the import statement, and also add a path() function
in the urlpatterns[] list, with arguments that will route users that comes in
via 127.0.0.1:8000/.

Then your file will look like this:

my_tennis_club/my_tennis_club/urls.py:

from django.contrib import admin

from django.urls import include, path

urlpatterns = [

path('', include('members.urls')),

path('admin/', admin.site.urls),

If the server is not running, navigate to the /my_tennis_club folder and execute
this command in the command prompt:

py manage.py runserver

In the browser window, type 127.0.0.1:8000/members/ in the address bar.

9|Page
Django Templates
Templates
In the Django Intro page, we learned that the result should be in HTML, and
it should be created in a template, so let's do that.

Create a templates folder inside the members folder, and create a HTML file
named myfirst.html

The file structure should be like this:

my_tennis_club
manage.py
my_tennis_club/
members/
templates/
myfirst.html

Open the HTML file and insert the following:

my_tennis_club/members/templates/myfirst.html:

10 | P a g e
<!DOCTYPE html>

<html>

<body>

<h1>Hello World!</h1>

<p>Welcome to my first Django project!</p>

</body>

</html>

Modify the View


Open the views.py file and replace the members view with this:

my_tennis_club/members/views.py:

from django.http import HttpResponse

from django.template import loader

def members(request):

template = loader.get_template('myfirst.html')

return HttpResponse(template.render())

Change Settings
To be able to work with more complicated stuff than "Hello World!", We have
to tell Django that a new app is created.

This is done in the settings.py file in the my_tennis_club folder.

Look up the INSTALLED_APPS[] list and add the members app like this:

11 | P a g e
my_tennis_club/my_tennis_club/settings.py:

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'members'

Open settings.py and Configure TEMPLATES section

Copy path of your template directory and paste under TEMPLATES section in
seetings.py

'DIRS': ['F:/djangobasicproject/my_tennis_club/members/templates'],

Save all files

Then run this command:

py manage.py migrate

Which will produce this output:

Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK

12 | P a g e
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK

(myworld) C:\Users\Your Name\myworld\my_tennis_club>

Start the server by navigating to the /my_tennis_club folder and execute this
command:

py manage.py runserver

In the browser window, type 127.0.0.1:8000/members/ in the address bar.

The result should look like this:

13 | P a g e
Django Models
A Django model is a table in your database.

Django Models
Up until now, output has been static data from Python or HTML templates.

Now we will see how Django allows us to work with data, without having to
change or upload files in the process.

In Django, data is created in objects, called Models, and is actually tables in


a database.

Create Table (Model)


To create a model, navigate to the models.py file in the /members/ folder.

Open it, and add a Member table by creating a Member class, and describe the
table fields in it:

my_tennis_club/members/models.py:

from django.db import models

class Member(models.Model):

firstname = models.CharField(max_length=255)

lastname = models.CharField(max_length=255)

The first field, firstname, is a Text field, and will contain the first name of the
members.

The second field, lastname, is also a Text field, with the member's last name.

Both firstname and lastname is set up to have a maximum of 255 characters.

14 | P a g e
SQLite Database
When we created the Django project, we got an empty SQLite database.

It was created in the my_tennis_club root folder, and has the


filename db.sqlite3.

By default, all Models created in the Django project will be created as tables
in this database.

Migrate
Now when we have described a Model in the models.py file, we must run a
command to actually create the table in the database.

Navigate to the /my_tennis_club/ folder and run this command:

py manage.py makemigrations members

Which will result in this output:

Migrations for 'members':


members\migrations\0001_initial.py
- Create model Member

(myworld) C:\Users\Your Name\myworld\my_tennis_club>

Django creates a file describing the changes and stores the file in
the /migrations/ folder:

my_tennis_club/members/migrations/0001_initial.py:

# Generated by Django 4.1.2 on 2022-10-27 11:14

from django.db import migrations, models

class Migration(migrations.Migration):

15 | P a g e
initial = True

dependencies = [

operations = [

migrations.CreateModel(

name='Member',

fields=[

('id', models.BigAutoField(auto_created=True,
primary_key=True, serialize=False, verbose_name='ID')),

('firstname', models.CharField(max_length=255)),

('lastname', models.CharField(max_length=255)),

],

),

Note that Django inserts an id field for your tables, which is an auto increment
number (first record gets the value 1, the second record 2 etc.), this is the
default behavior of Django, you can override it by describing your
own id field.

The table is not created yet, you will have to run one more command, then
Django will create and execute an SQL statement, based on the content of
the new file in the /migrations/ folder.

Run the migrate command:

py manage.py migrate

Which will result in this output:

Operations to perform:
Apply all migrations: admin, auth, contenttypes, members, sessions
Running migrations:
Applying members.0001_initial... OK

(myworld) C:\Users\Your Name\myworld\my_tennis_club>

16 | P a g e
Now you have a Member table in you database!

View SQL
As a side-note: you can view the SQL statement that were executed from the
migration above. All you have to do is to run this command, with the
migration number:

py manage.py sqlmigrate members 0001

Which will result in this output:

BEGIN;
--
-- Create model Member
--
CREATE TABLE "members_member" ("id" integer NOT NULL PRIMARY KEY
AUTOINCREMENT, "firstname" varchar(255) NOT NULL, "lastname"
varchar(255) NOT NULL); COMMIT;

Django Insert Data


Add Records
The Members table created is empty.

We will use the Python interpreter (Python shell) to add some members to it.

To open a Python shell, type this command:

py manage.py shell

Now we are in the shell, the result should be something like this:

Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928


64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

At the bottom, after the three >>> write the following:

17 | P a g e
>>> from members.models import Member

Hit [enter] and write this to look at the empty Member table:

>>> Member.objects.all()

This should give you an empty QuerySet object, like this:

<QuerySet []>

A QuerySet is a collection of data from a database.

Read more about QuerySets in the Django QuerySet chapter.

Add a record to the table, by executing these two lines:

>>> member = Member(firstname='Emil', lastname='Refsnes')


>>> member.save()

Execute this command to see if the Member table got a member:

>>> Member.objects.all().values()

Hopefully, the result will look like this:

<QuerySet [{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes'}]>

Add Multiple Records


You can add multiple records by making a list of Member objects, and
execute .save() on each entry:

>>> member1 = Member(firstname='Tobias', lastname='Refsnes')


>>> member1.save()
>>> member2 = Member(firstname='Linus', lastname='Refsnes')
>>> member2.save()
>>> member3 = Member(firstname='Lene', lastname='Refsnes')
>>> member3.save()
>>> member4 = Member(firstname='Stale', lastname='Refsnes')
>>> member4.save()
>>> member5 = Member(firstname='Jane', lastname='Doe')

18 | P a g e
>>> member5.save()
>>> members_list = [member1, member2, member3, member4, member5]
>>> for x in members_list:
>>> x.save()

Now there are 6 members in the Member table:

>>> Member.objects.all().values()
<QuerySet [{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes'},
{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes'},
{'id': 3, 'firstname': 'Linus', 'lastname': 'Refsnes'},
{'id': 4, 'firstname': 'Lene', 'lastname': 'Refsnes'},
{'id': 5, 'firstname': 'Stale', 'lastname': 'Refsnes'},
{'id': 6, 'firstname': 'Jane', 'lastname': 'Doe'}]>

Django Update Data


Update Records
To update records that are already in the database, we first have to get the
record we want to update:

>>> from members.models import Member


>>> x = Member.objects.all()[4]

x will now represent the member at index 4, which is "Stale Refsnes", but to
make sure, let us see if that is correct:

>>> x.firstname

This should give you this result:

'Stale'

Now we can change the values of this record:

>>> x.firstname = "Stalikken"


>>> x.save()

Execute this command to see if the Member table got updated:

>>> Member.objects.all().values()

19 | P a g e
Hopefully, the result will look like this:

<QuerySet [{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes'},


{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes'},
{'id': 3, 'firstname': 'Linus', 'lastname': 'Refsnes'},
{'id': 4, 'firstname': 'Lene', 'lastname': 'Refsnes'},
{'id': 5, 'firstname': 'Stalikken', 'lastname': 'Refsnes'},
{'id': 6, 'firstname': 'Jane', 'lastname': 'Doe'}]>

Django Delete Data


Delete Records
To delete a record in a table, start by getting the record you want to delete:

>>> from members.models import Member


>>> x = Member.objects.all()[5]

x will now represent the member at index 5, which is "Jane Doe", but to
make sure, let us see if that is correct:

>>> x.firstname

This should give you this result:

'Jane'

Now we can delete the record:

>>> x.delete()

The result will be:

(1, {'members.Member': 1})

Which tells us how many items were deleted, and from which Model.

If we look at the Member Model, we can see that 'Jane Doe' is removed from
the Model:

20 | P a g e
>>> Member.objects.all().values()
<QuerySet [{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes'},
{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes'},
{'id': 3, 'firstname': 'Linus', 'lastname': 'Refsnes'},
{'id': 4, 'firstname': 'Lene', 'lastname': 'Refsnes'},
{'id': 5, 'firstname': 'Stalikken', 'lastname': 'Refsnes'}]>
>>> exit()

Django Update Model


Add Fields in the Model
To add a field to a table after it is created, open the models.py file, and make
your changes:

my_tennis_club/members/models.py:

from django.db import models

class Member(models.Model):

firstname = models.CharField(max_length=255)

lastname = models.CharField(max_length=255)

phone = models.IntegerField()

joined_date = models.DateField()

As you can see, we want to add phone and joined_date to our Member Model.

This is a change in the Model's structure, and therefor we have to make a


migration to tell Django that it has to update the database:

py manage.py makemigrations members

Which, in my case, will result in a prompt, because I try to add fields that are
not allowed to be null, to a table that already contains records.

As you can see, Django asks if I want to provide the fields with a specific
value, or if I want to stop the migration and fix it in the model:

21 | P a g e
py manage.py makemigrations members
You are trying to add a non-nullable field 'joined_date' to members
without a default; we can't do that (the database needs something to
populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows
with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option:

I will select option 2, and open the models.py file again and allow NULL values
for the two new fields:

my_tennis_club/members/models.py:

from django.db import models

class Member(models.Model):

firstname = models.CharField(max_length=255)

lastname = models.CharField(max_length=255)

phone = models.IntegerField(null=True)

joined_date = models.DateField(null=True)

And make the migration once again:

py manage.py makemigrations members

Which will result in this:

Migrations for 'members':


members\migrations\0002_member_joined_date_member_phone.py
- Add field joined_date to member
- Add field phone to member

Run the migrate command:

py manage.py migrate

Which will result in this output:

Operations to perform:
Apply all migrations: admin, auth, contenttypes, members, sessions
Running migrations:
Applying members.0002_member_joined_date_member_phone... OK

22 | P a g e
(myworld) C:\Users\Your Name\myworld\my_tennis_club>

Insert Data
We can insert data to the two new fields.

First we enter the Python Shell:

py manage.py shell

Now we are in the shell, the result should be something like this:

Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928


64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

At the bottom, after the three >>> write the following (and hit [enter] for each
line):

>>> from members.models import Member


>>> x = Member.objects.all()[0]
>>> x.phone = 5551234
>>> x.joined_date = '2022-01-05'
>>> x.save()

This will insert a phone number and a date in the Member Model, at least for
the first record, the four remaining records will for now be left empty. We will
deal with them later in the tutorial.

Execute this command to see if the Member table got updated:

>>> Member.objects.all().values()

The result should look like this:

<QuerySet [
{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes', 'phone': 5551234,
'joined_date': datetime.date(2022, 1, 5)},
{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes', 'phone': None,
'joined_date': None},
{'id': 3, 'firstname': 'Linus', 'lastname': 'Refsnes', 'phone': None,
'joined_date': None},

23 | P a g e
{'id': 4, 'firstname': 'Lene', 'lastname': 'Refsnes', 'phone': None,
'joined_date': None},
{'id': 5, 'firstname': 'Stalikken', 'lastname': 'Refsnes', 'phone':
None, 'joined_date

Django Prepare Template


Create Template
After creating Models, with the fields and data we want in them, it is time to
display the data in a web page.

Start by creating an HTML file named all_members.html and place it in


the /templates/ folder:

my_tennis_club/members/templates/all_members.html:

<!DOCTYPE html>

<html>

<body>

<h1>Members</h1>

<ul>

{% for x in mymembers %}

<li>{{ x.firstname }} {{ x.lastname }}</li>

{% endfor %}

</ul>

</body>

</html>

24 | P a g e
Do you see the {% %} brackets inside the HTML document?

They are Django Tags, telling Django to perform some programming logic
inside these brackets.

Modify View
Next we need to make the model data available in the template. This is done
in the view.

In the view we have to import the Member model, and send it to the template
like this:

my_tennis_club/members/views.py:

from django.http import HttpResponse

from django.template import loader

from .models import Member

def members(request):

mymembers = Member.objects.all().values()

template = loader.get_template('all_members.html')

context = {

'mymembers': mymembers,

return HttpResponse(template.render(context, request))

The members view does the following:

 Creates a mymembers object with all the values of the Member model.
 Loads the all_members.html template.
 Creates an object containing the mymembers object.
 Sends the object to the template.
 Outputs the HTML that is rendered by the template.

25 | P a g e
The Result
If you have followed all the steps on your own computer, you can see the
result in your own browser:

Start the server by navigating to the /my_tennis_club/ folder and execute


this command:

py manage.py runserver

In the browser window, type 127.0.0.1:8000/members/ in the address bar.

26 | P a g e

You might also like