Django RestApis CRUD Application with Angular 10 & PostgreSQL tutorial

Tutorial: Django RestApis CRUD Application with Angular 10 & PostgreSQL tutorial

In this tutorial, we show you Angular 10 Http Client & Django Server example that uses Django to do CRUD with PostgreSQL (including finder method) and Angular 10 as front-end technology to make request and receive response.

Related Post: Django RestApis example – GET/POST/PUT/DELETE requests to PostgreSQL database

Technologies

– Django 2.1
– Angular 10
– RxJS 6
– PostgreSQL 9.5

Project Overview

1. Django Server

django-angular-6-rest-api-postgresql-django-server-architecture

With this system, we can use Angular Client to work with PostgreSQL Database via Django Server which has APIs:

  • GET api/customers/: get all customers
  • GET api/customers/[id]: get a customer by id
  • GET api/customers/age/[age]: find all customers by age
  • POST api/customers/: save a customer
  • PUT api/customers/[id]: update a customer by id
  • DELETE api/customers/[id]: delete a customer by id
  • DELETE api/customers/: delete all customers

2. Angular 10 Client

The image below shows overview about Angular Components that we will create:

django-angular-6-rest-api-postgresql-django-angular-client-component

Django RestApi server

Project structure

There are several folders and files in our Django project:

django-angular-6-rest-api-postgresql-django-project-structure

customers/apps.py: declares CustomersConfig class (subclass of the django.apps.AppConfig) that represents our Django app and its configuration.
gkzRestApi/settings.py: configures settings for the Django project, including INSTALLED_APPS list with Django REST framework and Customers Application.
customers/models.py: defines Customer data model class (subclass of the django.db.models.Model).
migrations/0001_initial.py: is generated by makemigrations command, includes the code to create the Customer model, will be run by migrate to generate PostgreSQL database table for Customer model.
customers/serializers.py: declares CustomerSerializer class (subclass of rest_framework.serializers.ModelSerializer) for Customer instances to manage serialization to JSON and deserialization from JSON.
customers/views.py: contains methods to process HTTP requests and produce HTTP responses (using CustomerSerializer).
customers/urls.py: defines urlpatterns to be matched with request functions in the views.py.
gkzRestApi/urls.py: defines root URL configurations that includes the URL patterns declared in customers/urls.py.

Setup Django RestApi project

Install Django REST framework

Django REST framework works on top of Django and helps us to build RESTful Web Services flexibly. To install this package, run command:
pip install djangorestframework

Create RestApi project

Create Django project named gkzRestApi with command:
django-admin startproject gkzRestApi

django-angular-6-rest-api-postgresql-django-create-project

Install Python PostgreSQL adapter

We have to install Python PostgreSQL adapter to work with PostgreSQL database.
In this tutorial, we use psycopg2: pip install psycopg2.

Setup PostgreSQL Database engine

Open gkzRestApi/settings.py and change declaration of DATABASES:


DATABASES = {
   'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'testdb',
        'USER': 'postgres',
        'PASSWORD': '123',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

Create Customers App

Run following commands to create new Django App named customers:
cd gkzRestApi
python manage.py startapp customers

django-angular-6-rest-api-postgresql-django-create-project-app

Open customers/apps.py, we can see CustomersConfig class (subclass of the django.apps.AppConfig) that represents our Django app and its configuration:


from django.apps import AppConfig


class CustomersConfig(AppConfig):
    name = 'customers'

Add Django Rest framework & RestApi App to Django project

Open gkzRestApi/settings.py, find INSTALLED_APPS, then add:


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Django REST framework 
    'rest_framework',
    # Customers application 
    'customers.apps.CustomersConfig',
]

Add CORS Configurations

Inside gkzRestApi/settings.py, add:

INSTALLED_APPS = [
    ...
    # CORS
    'corsheaders',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # CORS
    'corsheaders.middleware.CorsMiddleware',  
    'django.middleware.common.CommonMiddleware',  
]

CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
    'localhost:4200',
)

Implement Django RestApi App

Data Model

Create Data Model

customers/models.py

from django.db import models


class Customer(models.Model):
    name = models.CharField(max_length=70, blank=False, default='')
    age = models.IntegerField(blank=False, default=1)
    active = models.BooleanField(default=False)
Run initial migration for data model

Run following Python script:
python manage.py makemigrations customers

We can see output text:

Migrations for 'customers':
  customers\migrations\0001_initial.py
    - Create model Customer

It indicates that the customers/migrations/0001_initial.py file includes code to create Customer data model:


# Generated by Django 2.1.7 on 2019-03-07 01:28

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Customer',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(default='', max_length=70)),
                ('age', models.IntegerField(default=1)),
                ('active', models.BooleanField(default=False)),
            ],
        ),
    ]

The generated code defines a subclass of the django.db.migrations.Migration. It has an operation for creating Customer model table. Call to migrations.CreateModel() method will create a table that allows the underlying database to persist the model.

Run the following Python script to apply the generated migration:
python manage.py migrate customers

The output text:


Operations to perform:
  Apply all migrations: customers
Running migrations:
  Applying customers.0001_initial... OK

Check PostgreSQL Database, now we can see that a table for Customer model was generated and it’s named customers_customer:

django-angular-6-rest-api-postgresql-django-postgresql-table

Create Serializer class

We need a Serializer class for Customer instances to manage serialization to JSON and deserialization from JSON.

– This CustomerSerializer will inherit from rest_framework.serializers.ModelSerializer superclass.
ModelSerializer class automatically populates a set of default fields and default validators, we only need to specify the model class.

Now, under customers package, create serializers.py file:

from rest_framework import serializers 
from customers.models import Customer


class CustomerSerializer(serializers.ModelSerializer):

    class Meta:
        model = Customer
        fields = ('id',
                  'name',
                  'age',
                  'active')

Meta inner class declares 2 attributes:
model: specifies the model related to the serializer
fields: specifies a tuple of field names that we want to include in the serialization

Create API Views

Open customers/views.py file and declare two functions:
customer_list(): get list of customers, save a new customer, delete all customers
customer_detail(): get/update/delete customer by ‘id’
customer_list_age(): find all customers by ‘age’


from django.shortcuts import render 
from django.http import HttpResponse
from django.http.response import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser 
from rest_framework import status

from customers.models import Customer
from customers.serializers import CustomerSerializer


@csrf_exempt
def customer_list(request):
    if request.method == 'GET':
        customers = Customer.objects.all()
        customers_serializer = CustomerSerializer(customers, many=True)
        return JsonResponse(customers_serializer.data, safe=False)
        # In order to serialize objects, we must set 'safe=False'

    elif request.method == 'POST':
        customer_data = JSONParser().parse(request)
        customer_serializer = CustomerSerializer(data=customer_data)
        if customer_serializer.is_valid():
            customer_serializer.save()
            return JsonResponse(customer_serializer.data, status=status.HTTP_201_CREATED) 
        return JsonResponse(customer_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    elif request.method == 'DELETE':
        Customer.objects.all().delete()
        return HttpResponse(status=status.HTTP_204_NO_CONTENT)


@csrf_exempt 
def customer_detail(request, pk):
    try: 
        customer = Customer.objects.get(pk=pk) 
    except Customer.DoesNotExist: 
        return HttpResponse(status=status.HTTP_404_NOT_FOUND) 
 
    if request.method == 'GET': 
        customer_serializer = CustomerSerializer(customer) 
        return JsonResponse(customer_serializer.data) 
 
    elif request.method == 'PUT': 
        customer_data = JSONParser().parse(request) 
        customer_serializer = CustomerSerializer(customer, data=customer_data) 
        if customer_serializer.is_valid(): 
            customer_serializer.save() 
            return JsonResponse(customer_serializer.data) 
        return JsonResponse(customer_serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
 
    elif request.method == 'DELETE': 
        customer.delete() 
        return HttpResponse(status=status.HTTP_204_NO_CONTENT)

    
@csrf_exempt
def customer_list_age(request, age):
    customers = Customer.objects.filter(age=age)
        
    if request.method == 'GET': 
        customers_serializer = CustomerSerializer(customers, many=True)
        return JsonResponse(customers_serializer.data, safe=False)
        # In order to serialize objects, we must set 'safe=False'

Route Urls to Views functions

Create urls.py in customers folder, now we will define urlpatterns to be matched with request functions in the views.py.

    
from django.conf.urls import url 
from customers import views 
 
urlpatterns = [ 
    url(r'^customers/$', views.customer_list),
    url(r'^customers/(?P[0-9]+)$', views.customer_detail),
    url(r'^customers/age/(?P[0-9]+)/$', views.customer_list_age),
]

Now we must include above URL patterns in root URL configurations.
Open gkzRestApi/urls.py, replace the code:


from django.conf.urls import url, include 
 
urlpatterns = [ 
    url(r'^api/', include('customers.urls')), 
]

Angular Client

Project Structure

django-angular-6-rest-api-postgresql-angular-project-structure

We have:
– 4 components: customers-list, customer-details, create-customer, search-customer.
– 3 modules: FormsModule, HttpClientModule, AppRoutingModule.
customer.ts: class Customer (id, firstName, lastName)
customer.service.ts: Service for Http Client methods
app-routing.module.ts: Routing configuration

Setup Angular Project

Create Angular Project

Run command: ng new AngularDjango.

Create Service & Components

On Project folder, run commands below:
ng g s customer
ng g c create-customer
ng g c customer-details
ng g c customers-list
ng g c search-customers

On each Component selector, delete app- prefix, then change tslint.json rules"component-selector" to false.

App Module

Check app.module.ts file, we can see Angular Components & Service are added automatically.
Now we need to import FormsModule, HttpClientModule for using form submission and HTTP requests to Django server. We also import AppRoutingModule for routing (will be created later in this tutorial).


import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';
import { CreateCustomerComponent } from './create-customer/create-customer.component';
import { CustomerDetailsComponent } from './customer-details/customer-details.component';
import { CustomersListComponent } from './customers-list/customers-list.component';
import { SearchCustomersComponent } from './search-customers/search-customers.component';

import { AppRoutingModule } from './app-routing.module';

@NgModule({
  declarations: [
    AppComponent,
    CreateCustomerComponent,
    CustomerDetailsComponent,
    CustomersListComponent,
    SearchCustomersComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    AppRoutingModule,
    HttpClientModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Implement Angular Client App

Data Model

Create new file named customer.ts:


export class Customer {
    id: number;
    name: string;
    age: number;
    active: boolean;
}

Data Service

This service uses Angular HttpClient object to make get/post/put/delete request to Django Rest Api Server.

customer.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class CustomerService {

  private baseUrl = 'http://localhost:8000/api/customers';

  constructor(private http: HttpClient) { }

  getCustomer(id: number): Observable<Object> {
    return this.http.get(`${this.baseUrl}/${id}`);
  }

  createCustomer(customer: Object): Observable<Object> {
    return this.http.post(`${this.baseUrl}/`, customer);
  }

  updateCustomer(id: number, value: any): Observable<Object> {
    return this.http.put(`${this.baseUrl}/${id}`, value);
  }

  deleteCustomer(id: number): Observable<any> {
    return this.http.delete(`${this.baseUrl}/${id}`);
  }

  getCustomersList(): Observable<any> {
    return this.http.get(`${this.baseUrl}/`);
  }

  getCustomersByAge(age: number): Observable<any> {
    return this.http.get(`${this.baseUrl}/age/${age}/`);
  }

  deleteAll(): Observable<any> {
    return this.http.delete(`${this.baseUrl}/`);
  }
}

Components

List of Customers

This component calls Data service’s getCustomersList() function, then shows the result as Customer list. It also has deleteCustomers() function that calls Data service’s deleteAll() function to delete all customers.

customers-list/customers-list.component.ts


import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';

import { CustomerService } from '../customer.service';
import { Customer } from '../customer';

@Component({
  selector: 'customers-list',
  templateUrl: './customers-list.component.html',
  styleUrls: ['./customers-list.component.css']
})
export class CustomersListComponent implements OnInit {

  customers: Observable;

  constructor(private customerService: CustomerService) { }

  ngOnInit() {
    this.reloadData();
  }

  deleteCustomers() {
    this.customerService.deleteAll()
      .subscribe(
        data => {
          console.log(data);
          this.reloadData();
        },
        error => console.log('ERROR: ' + error));
  }

  reloadData() {
    this.customers = this.customerService.getCustomersList();
  }
}

customers-list/customers-list.component.html

<h1>Customers</h1>

<div *ngFor="let customer of customers | async" style="width: 300px;">
  <customer-details [customer]='customer'></customer-details>
</div>

<div>
  <button type="button" class="button btn-danger" (click)='deleteCustomers()'>Delete All</button>
</div>

This template embeds customer-details component that we will implement right here.

Customer Details

customer-details/customer-details.component.ts


import { Component, OnInit, Input } from '@angular/core';
import { CustomerService } from '../customer.service';
import { Customer } from '../customer';

import { CustomersListComponent } from '../customers-list/customers-list.component';

@Component({
  selector: 'customer-details',
  templateUrl: './customer-details.component.html',
  styleUrls: ['./customer-details.component.css']
})
export class CustomerDetailsComponent implements OnInit {

  @Input() customer: Customer;

  constructor(private customerService: CustomerService, private listComponent: CustomersListComponent) { }

  ngOnInit() {
  }

  updateActive(isActive: boolean) {
    this.customerService.updateCustomer(this.customer.id,
      { name: this.customer.name, age: this.customer.age, active: isActive })
      .subscribe(
        data => {
          console.log(data);
          this.customer = data as Customer;
        },
        error => console.log(error));
  }

  deleteCustomer() {
    this.customerService.deleteCustomer(this.customer.id)
      .subscribe(
        data => {
          console.log(data);
          this.listComponent.reloadData();
        },
        error => console.log(error));
  }

}

As you can see, this component receives input Customer data object from parent component (CustomersListComponent), then apply the information on Data service’s functions: updateCustomer() and deleteCustomer()..

customer-details/customer-details.component.html

<div *ngIf="customer">
  <div>
    <label>Name: </label> {{customer.name}}
  </div>
  <div>
    <label>Age: </label> {{customer.age}}
  </div>
  <div>
    <label>Active: </label> {{customer.active}}
  </div>

  <span class="button is-small btn-primary" *ngIf='customer.active' (click)='updateActive(false)'>Inactive</span>

  <span class="button is-small btn-primary" *ngIf='!customer.active' (click)='updateActive(true)'>Active</span>

  <span class="button is-small btn-danger" (click)='deleteCustomer()'>Delete</span>

  <hr />
</div>
Create Customer

This component uses Data service’s createCustomer() function to save Customer information to the database.

create-customer/create-customer.component.ts


import { Component, OnInit } from '@angular/core';

import { Customer } from '../customer';
import { CustomerService } from '../customer.service';

@Component({
  selector: 'create-customer',
  templateUrl: './create-customer.component.html',
  styleUrls: ['./create-customer.component.css']
})
export class CreateCustomerComponent implements OnInit {

  customer: Customer = new Customer();
  submitted = false;

  constructor(private customerService: CustomerService) { }

  ngOnInit() {
  }

  newCustomer(): void {
    this.submitted = false;
    this.customer = new Customer();
  }

  save() {
    this.customerService.createCustomer(this.customer)
      .subscribe(
        data => {
          console.log(data);
          this.submitted = true;
        },
        error => console.log(error));
    this.customer = new Customer();
  }

  onSubmit() {
    this.save();
  }

}

create-customer/create-customer.component.html

<h3>Create Customer</h3>
<div [hidden]="submitted" style="width: 300px;">
  <form (ngSubmit)="onSubmit()">
    <div class="form-group">
      <label for="name">Name</label>
      <input type="text" class="form-control" id="name" required [(ngModel)]="customer.name" name="name">
    </div>

    <div class="form-group">
      <label for="age">Age</label>
      <input type="text" class="form-control" id="age" required [(ngModel)]="customer.age" name="age">
    </div>

    <button type="submit" class="btn btn-success">Submit</button>
  </form>
</div>

<div [hidden]="!submitted">
  <h4>You submitted successfully!</h4>
  <button class="btn btn-success" (click)="newCustomer()">Add</button>
</div>
Search Customers

This component uses Data services’s getCustomersByAge() function as finder method to find customers by age

search-customers/search-customers.component.ts


import { Component, OnInit } from '@angular/core';
import { Customer } from '../customer';
import { CustomerService } from '../customer.service';

@Component({
  selector: 'search-customers',
  templateUrl: './search-customers.component.html',
  styleUrls: ['./search-customers.component.css']
})
export class SearchCustomersComponent implements OnInit {

  age: number;
  customers: Customer[];

  constructor(private dataService: CustomerService) { }

  ngOnInit() {
    this.age = 0;
  }

  private searchCustomers() {
    this.customers = [];
    this.dataService.getCustomersByAge(this.age)
      .subscribe(customers => this.customers = customers);
  }

  onSubmit() {
    this.searchCustomers();
  }

}

search-customers/search-customers.component.html

<h3>Find By Age</h3>
<div style="width: 300px;">
  <form (ngSubmit)="onSubmit()">
    <div class="form-group">
      <label for="lastname">Age</label>
      <input type="text" class="form-control" id="age" required [(ngModel)]="age" name="age">
    </div>

    <div class="btn-group">
      <button type="submit" class="btn btn-success">Submit</button>
    </div>
  </form>
</div>
<ul>
  <li *ngFor="let customer of customers">
    <h4>{{customer.id}} - {{customer.name}} {{customer.age}}</h4>
  </li>
</ul>

Add Router

app-routing.module.ts


import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CustomersListComponent } from './customers-list/customers-list.component';
import { CreateCustomerComponent } from './create-customer/create-customer.component';
import { SearchCustomersComponent } from './search-customers/search-customers.component';

const routes: Routes = [
    { path: '', redirectTo: 'customer', pathMatch: 'full' },
    { path: 'customer', component: CustomersListComponent },
    { path: 'add', component: CreateCustomerComponent },
    { path: 'findbyage', component: SearchCustomersComponent },
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})

export class AppRoutingModule { }

And AppComponent HTML for routing:

app.component.html

<div style="padding: 20px;">
  <h1 style="color: blue">ozenero.com</h1>
  <h3>Angular - Django App</h3>
  <nav>
    <a routerLink="customer" class="btn btn-primary active" role="button" routerLinkActive="active">Customers</a>
    <a routerLink="add" class="btn btn-primary active" role="button" routerLinkActive="active">Add</a>
    <a routerLink="findbyage" class="btn btn-primary active" role="button" routerLinkActive="active">Search</a>
  </nav>
  <router-outlet></router-outlet>
</div>

Run & Check Results

– Run Django server with command: python manage.py runserver.
– Run Angular App with command: ng serve.
– Open browser for url http://localhost:4200/:

Add Customer:

django-rest-api-crud-app-angular-example-postgresql-create-customer

Check database after saving Customers:

django-rest-api-crud-app-angular-example-postgresql-show-customers-database

Show Customers:

django-rest-api-crud-app-angular-example-postgresql-show-customers

Click on Active button to update Customer status:

django-rest-api-crud-app-angular-example-postgresql-update-customers

Check database after updating:

django-rest-api-crud-app-angular-example-postgresql-update-customers-database

Search Customers by Age:

django-rest-api-crud-app-angular-example-postgresql-search-customers

Delete a Customer:

django-rest-api-crud-app-angular-example-postgresql-delete-a-customer

Check database after deleting a Customer:

django-rest-api-crud-app-angular-example-postgresql-delete-a-customer-database

Delete All Customers:

django-rest-api-crud-app-angular-example-postgresql-delete-all-customers

Now the table is empty:

django-rest-api-crud-app-angular-example-postgresql-delete-all-customers-database

Source Code

Django-RestApi-server-PostgreSQL
AngularDjango-PostgreSQL

64 thoughts on “Django RestApis CRUD Application with Angular 10 & PostgreSQL tutorial”

  1. I’m very pleased to find this web site. I wanted to thank you for your time due to this fantastic read!! I definitely savored every part of it and i also have you bookmarked to see new stuff on your website.

  2. Heya i am for the primary time here. I found this board and I find It truly useful & it helped me out a lot. I’m hoping to give one thing back and aid others such as you helped me.

  3. Wow that was unusual. I just wrote an very long comment but after I clicked submit my comment didn’t appear. Grrrr… well I’m not writing all that over again. Anyway, just wanted to say great blog!

  4. Perfectly, i need to assert that crafting talents possibly not which terrible, having said that i’ll you could increase ones own authoring proficiency. Working with not as much text to talk about the actual. You could check out bing designed for penning proficiency teaching web page and plans.

  5. Do you write more? It merely required a few moments to see your entry and so have an awareness that I know most people miss out on. Getting more people to join the discussion is usually a great thing.

  6. Every word in this piece of work is very clear and your passion for this topic shines. Please continue your work in this area and I hope to see more from you in the future.

  7. 934497 763078hello!,I like your writing so significantly! share we communicate extra approximately your post on AOL? I need an expert in this space to solve my problem. Perhaps that is you! Looking ahead to see you. 25164

  8. 277529 940664Discover how to deal along with your domain get in touch with details and registration. Recognize domain namelocking and Exclusive domain name Registration. 686529

  9. 61801 627856Just wanna remark which you have a really nice web web site , I like the layout it actually stands out. 252514

  10. 753376 849292This will be a fantastic blog, might you be interested in doing an interview regarding how you designed it? If so e-mail me! 216627

  11. What i don’t understood is if truth be told how you’re now not actually a lot more neatly-preferred than you may be now. You are so intelligent. You already know therefore considerably when it comes to this matter, made me individually believe it from numerous varied angles. Its like men and women are not involved unless it’s something to accomplish with Woman gaga! Your individual stuffs outstanding. At all times maintain it up!

  12. Iím impressed, I have to admit. Seldom do I encounter a blog thatís both educative and interesting, and let me tell you, you have hit the nail on the head. The issue is an issue that not enough folks are speaking intelligently about. Now i’m very happy that I found this in my hunt for something regarding this.

  13. My family every time say that I am killing my time here at web, except I know I am getting know-how everyday by reading
    such fastidious content.

  14. I read this piece of writing completely on the topic
    of the comparison of hottest and earlier technologies,
    it’s awesome article.

  15. I like the valuable info you supply in your articles.
    I will bookmark your weblog and check once more right here frequently.

    I’m slightly sure I’ll be informed many new stuff proper right here!
    Good luck for the next!

  16. Ahaa, its nice discussion on the topic of this piece of writing at
    this place at this webpage, I have read all that, so
    now me also commenting here.

  17. I think that what you published made a great deal of sense.
    But, think about this, suppose you wrote a catchier title?
    I mean, I don’t wish to tell you how to run your blog, however what if you added a headline
    that grabbed people’s attention? I mean ozenero | Mobile & Web Programming
    Tutorials is kinda plain. You ought to peek at Yahoo’s front
    page and see how they create post titles to get people interested.

    You might add a video or a related picture or two to get readers interested about everything’ve written. Just my opinion, it
    could bring your posts a little bit more interesting.

  18. It’s really very complicated in this busy life to
    listen news on Television, thus I simply use the web for that purpose, and get the most up-to-date news.

  19. Thanks for every other informative web site.
    Where else may I get that kind of information written in such an ideal approach?
    I have a undertaking that I’m simply now working on, and I’ve been at the glance out for such
    information.

  20. After exploring a few of the blog posts on your blog, I really like your way
    of blogging. I bookmarked it to my bookmark website list and will be checking back
    soon. Please visit my website too and tell me how you feel.

  21. Howdy! I know this is kinda off topic but I was wondering which blog platform are you
    using for this website? I’m getting tired of WordPress because I’ve had problems with hackers
    and I’m looking at alternatives for another platform.
    I would be fantastic if you could point me in the direction of a good platform.

  22. Hi there are using WordPress for your site platform? I’m
    new to the blog world but I’m trying to get started and create my own. Do you require any html coding knowledge to make your own blog?
    Any help would be really appreciated!

  23. It is in reality a nice and helpful piece of information. I am happy that
    you simply shared this useful info with us. Please keep us up to date like this.

    Thanks for sharing.

  24. Hi there would you mind letting me know which hosting
    company you’re utilizing? I’ve loaded your blog in 3 completely
    different internet browsers and I must say this blog loads
    a lot quicker then most. Can you suggest a good web hosting provider at a
    reasonable price? Kudos, I appreciate it!

  25. A person necessarily lend a hand to make seriously articles I would state.
    This is the first time I frequented your web page and to this point?

    I surprised with the research you made to make this particular submit incredible.
    Fantastic process!

  26. Heya i am for the primary time here. I found this board and I find It
    really helpful & it helped me out a lot. I hope to offer one thing back and
    aid others like you aided me.

  27. We stumbled over here by a different web page and thought I
    may as well check things out. I like what I see so
    i am just following you. Look forward to looking over your web page
    yet again.

  28. You actually make it seem so easy with your presentation but I find this topic to be really something which I think I would never understand.
    It seems too complex and extremely broad for me.
    I am looking forward for your next post, I’ll try to get the hang of it!

  29. excellent issues altogether, you just won a logo new reader.
    What could you suggest in regards to your post
    that you just made a few days ago? Any sure?

  30. This is very interesting, You are a very skilled blogger.
    I have joined your rss feed and look forward to seeking more of your great post.
    Also, I’ve shared your web site in my social
    networks!

  31. If some one wishes expert view on the topic of blogging and site-building then i advise him/her
    to visit this webpage, Keep up the good job.

  32. Howdy, There’s no doubt that your web site may be having internet browser compatibility problems.
    Whenever I take a look at your website in Safari, it looks fine however,
    when opening in Internet Explorer, it’s got some overlapping issues.
    I simply wanted to give you a quick heads up! Besides
    that, fantastic blog!

  33. Simply wish to say your article is as surprising. The clearness in your post is simply nice and i can assume you’re an expert on this subject.
    Well with your permission allow me to grab your RSS feed to keep updated with
    forthcoming post. Thanks a million and please continue
    the gratifying work.

  34. always i used to read smaller articles which as well
    clear their motive, and that is also happening with this
    piece of writing which I am reading here.

  35. Having read this I believed it was very enlightening.
    I appreciate you finding the time and energy to put this
    article together. I once again find myself personally spending way too much time
    both reading and leaving comments. But so what, it was still worthwhile!

  36. It’s a pity you don’t have a donate button! I’d most
    certainly donate to this fantastic blog! I suppose for now i’ll
    settle for book-marking and adding your RSS feed to
    my Google account. I look forward to new updates and will talk about this website
    with my Facebook group. Talk soon!

  37. What’s up, this weekend is fastidious designed for me, as this moment i am reading this wonderful educational article
    here at my residence.

  38. Link exchange is nothing else except it is simply
    placing the other person’s webpage link on your
    page at appropriate place and other person will also do similar in support of you.

  39. Hey! I could have sworn I’ve been to this website before but after browsing through
    some of the post I realized it’s new to me. Anyways, I’m definitely happy I
    found it and I’ll be book-marking and checking back frequently!

  40. An impressive share! I’ve just forwarded this onto a colleague who was conducting a little research on this.
    And he in fact ordered me lunch because I discovered it for him…
    lol. So allow me to reword this…. Thank YOU for the meal!!
    But yeah, thanx for spending some time to talk about
    this subject here on your blog.

  41. After checking out a handful of the articles on your web page, I really appreciate
    your way of blogging. I bookmarked it to my bookmark webpage list and will be checking
    back soon. Please check out my web site too and let me know your opinion.

  42. You’re so cool! I do not suppose I have read through a single thing like that before.
    So great to find someone with some original thoughts
    on this issue. Seriously.. many thanks for starting this
    up. This web site is one thing that is required on the internet, someone with a little originality!

  43. Exceptional post however , I was wondering if you could write a litte more on this
    topic? I’d be very grateful if you could elaborate a little bit more.
    Cheers!

Leave a Reply

Your email address will not be published. Required fields are marked *