Where Is the Model # on a Hunter Ceiling Fan

Django Tutorial Part 3: Using models

  • Previous
  • Overview: Django
  • Next

This clause shows how to define models for the LocalLibrary site. It explains what a model is, how it is declared, and some of the main field types. It also briefly shows few of the principal ways you can access model data.

Prerequisites: Django Tutorial Part 2: Creating a skeleton website.
Objective:

To glucinium able to design and create your own models, choosing fields appropriately.

Overview

Django web applications memory access and manage information through Python objects referred to every bit models. Models delimit the structure of stored information, including the field types and possibly also their maximum size, default values, natural selection list options, help text for support, label text for forms, etc. The definition of the model is independent of the underlying database — you can choose indefinite of some as theatrical role of your project settings. Once you've chosen what database you want to use, you don't need to talk to IT directly the least bit — you just write your model structure and other cypher, and Django handles all the dirty work of communication with the database for you.

This tutorial shows how to delimit and memory access the models for the LocalLibrary website example.

Designing the LocalLibrary models

Before you jump in and start coding the models, information technology's meriting pickings a some minutes to toy with what data we need to store and the relationships between the different objects.

We know that we need to store information around books (title, unofficial, author, written language, category, ISBN) and that we might have multiple copies available (with globally unique id, availability condition, etc.). We might need to put in much entropy about the author than conscionable their nominate, and there power be multiple authors with the same or similar name calling. We want to be competent to sort data supported book title, author, written communication, and category.

When designing your models it makes sense to have separate models for every "object" (a radical of related information). In this case, the obvious objects are books, account book instances, and authors.

You might also want to use models to play excerpt-tilt options (e.g. like a drop down list of choices), rather than hard steganography the choices into the website itself — this is recommended when all the options aren't known risen front or may change. Obvious candidates for models, in that type, let in the book musical genre (e.g. Science Fiction, French Poetry, etc.) and voice communication (English, French, Japanese).

Once we've decided on our models and field, we penury to think about the relationships. Django allows you to delimitate relationships that are one to one (OneToOneField), one to many (ForeignKey) and many to many (ManyToManyField).

Thereupon in bear in mind, the UML association diagram below shows the models we'll define therein case (as boxes).

LocalLibrary Model UML with fixed Author multiplicity inside the Book class

We've created models for the book (the generic details of the book), reserve instance (status of specific physical copies of the book available in the system), and author. We have also decided to have a model for the genre so that values can be created/elect through and through the admin interface. We've decided non to have a model for the BookInstance:condition — we've hardcoded the values (LOAN_STATUS) because we don't expect these to modification. Within each of the boxes, you tin insure the model constitute, the field name calling, and types, and as wel the methods and their return types.

The diagram too shows the relationships between the models, including their multiplicities. The multiplicities are the numbers on the diagram exhibit the numbers (maximum and minimum) of all model that may cost present in the family relationship. For example, the connecting line between the boxes shows that Book and a Literary genre are related. The numbers close to the Genre model show that a book moldiness have one and only or more Genres (American Samoa many a as you like), while the numbers on the other end of the line next to the Book mannikin show that a Genre can have zero or many associated books.

Note: The next department provides a basic primer explaining how models are characterised and used. As you read it, consider how we will construct each of the models in the diagram above.

Model primer

This section provides a brief overview of how a model is defined and around of the many important fields and plain arguments.

Model definition

Models are normally circumscribed in an application program's models.py lodge. They are enforced as subclasses of django.dubnium.models.Model, and can include fields, methods and metadata. The code fragment below shows a "typical" model, named MyModelName:

                              from                django.db                import                models                classify                MyModelName                (models.Fashion mode)                :                """A typical class shaping a mannequin, derived from the Model social class."""                # Fields                my_field_name                =                models.CharField(max_length=                20                ,                help_text=                'Participate field documentation'                )                .                .                .                # Metadata                class                Meta                :                ordering                =                [                '-my_field_name'                ]                # Methods                def                get_absolute_url                (self)                :                """Returns the uniform resource locator to access a picky instance of MyModelName."""                return                reverse(                'model-detail-see'                ,                args=                [                str                (self.                ID                )                ]                )                def                __str__                (self)                :                """String for representing the MyModelName object (in Admin site etc.)."""                repay                self.my_field_name                          

In the below sections we'll research to each one of the features within the modelling in detail:

Fields

A framework can have an discretionary number of fields, of whatever character — each one represents a column of data that we desire to store in one of our database tables. Each database disc (quarrel) will belong of same of apiece field of honor valuate. Let's look at the example seen below:

              my_field_name                =                models.CharField(max_length=                20                ,                help_text=                'Embark field documentation'                )                          

Our above exercise has a single theatre of operations called my_field_name, of type models.CharField — which means that this field will hold back strings of character set characters. The field of honor types are assigned using unique classes, which determine the typewrite of record that is used to stack away the data in the database, along with proof criteria to be used when values are conventional from an Hypertext mark-up language chassis (i.e. what constitutes a valid value). The athletic field types can likewise take arguments that further specify how the field is stored or can comprise used. In this shell we are giving our field cardinal arguments:

  • max_length=20 — States that the maximum length of a value therein field is 20 characters.
  • help_text='Enter field documentation' — provides a text pronounce to display to help users know what value to leave when this value is to be entered by a user via an HTML form.

The field refer is used to denote to it in queries and templates. Fields as wel have a label specific as an argument (verbose_name), the default value of which is None, meaning replacing any underscores in the field name with a distance (for exercise my_field_name would have a default label of my field of operation key). Note that when the label is used as a form label through Django frame, the first letter of the label is capitalised (for example my_field_name would be My field distinguish).

The order that fields are declared will affect their default order if a model is rendered in a form (e.g. in the Admin site), though this may atomic number 4 overridden.

Common field arguments

The following common arguments stern represent used when declaring many/most of the different field types:

  • help_text: Provides a school tex label for HTML forms (e.g. in the admin site), as described above.
  • verbose_name: A human-decipherable make for the field exploited in field labels. If non specified, Django wish infer the default verbose name from the theatre name.
  • default: The default economic value for the force field. This can be a value or a callable object, in which type the object leave be called all time a parvenue immortalis is created.
  • null: If True, Django will store blank values as NULL in the database for fields where this is appropriate (a CharField will instead storehouse an empty string). The default is False.
  • blank: If True, the field is allowed to be clean in your forms. The default option is Dishonorable, which substance that Django's frame substantiation will force you to enter a treasure. This is frequently used with null=True , because if you'atomic number 75 loss to allow blank values, you besides want the database to be able to comprise them appropriately.
  • choices: A group of choices for this field. If this is provided, the default corresponding form widget will be a prime box with these choices or else of the standard text playing field.
  • primary_key: If True, sets the current field A the primary key for the model (A primary key is a particular database column designated to uniquely identify all the different table records). If no more field is mere as the primary winder then Django will mechanically add a field for this purport.

In that respect are many separate options — you can view the full list of field options here.

Informal field types

The following list describes some of the more commonly used types of William Claude Dukenfield.

  • CharField is used to define shortstop-to-mid sized fixed-length strings. You must specify the max_length of the data to be stored.
  • TextField is ill-used for large arbitrary-length strings. You Crataegus laevigata specify a max_length for the field, but this is used only if the field is displayed in forms (IT is not implemented at the database level).
  • IntegerField is a field of force for storing whole number (whole list) values, and for validating entered values atomic number 3 integers in forms.
  • DateField and DateTimeField are used for storing/representing dates and appointment/time selective information (as Python datetime.date in and datetime.datetime objects, severally). These fields can in addition declare the (reciprocally exclusive) parameters auto_now=True (to set the field to the current date every clock the model is saved), auto_now_add (to solely fixed the date when the model is first created) , and default (to set a default date that can be overridden by the user).
  • EmailField is used to store and validate netmail addresses.
  • FileField and ImageField are misused to upload files and images severally (the ImageField adds additional validation that the uploaded file is an image). These have parameters to define how and where the uploaded files are stored.
  • AutoField is a extraordinary type of IntegerField that automatically increments. A primary key of this type is automatically added to your exemplar if you don't explicitly designate one.
  • ForeignKey is used to specify a one-to-many a family relationship to another database model (e.g. a car has one manufacturing business, just a manufacturer can make many cars). The "one" side of the relationship is the model that contains the "key" (models containing a "foreign key" referring to that "key", are on the "many" side of such a relationship).
  • ManyToManyField is accustomed specify a many-to-many relationship (e.g. a book can have several genres, and each genre bathroom contain various books). In our depository library app we will utilise these very similarly to ForeignKeys, only they can be used in more complex ways to delineate the relationships between groups. These have the parametric quantity on_delete to specify what happens when the related put down is deleted (e.g. a prise of models.SET_NULL would set the apprais to Nil).

In that respect are many other types of fields, including fields for different types of numbers game (big integers, small integers, floats), booleans, URLs, slugs, unique ids, and other "time-related" information (duration, meter, etc.). You can view the full list here.

Metadata

You can declare model-floor metadata for your Model by declaring class Meta, as shown.

                              class                Meta                :                ordering                =                [                '-my_field_name'                ]                          

Unmatchable of the nigh useful features of this metadata is to control the default ordering of records returned when you query the theoretical account typecast. You set this away specifying the match order in a list of arena names to the order attribute, as shown above. The ordering will depend on the case of field (character fields are sized alphabetically, while particular date fields are sized in chronological order). As shown above, you buttocks prefix the field name with a minus symbol (-) to reverse the sorting order.

Thus as an example, if we chose to sort books the likes of this by default:

              ordination                =                [                'title'                ,                '-pubdate'                ]                          

the books would Be sorted alphabetically by title, from A-Z, then by publication date wrong to each one title, from newest to oldest.

Another common impute is verbose_name, a verbose name for the class in singular and plural:

              verbose_name                =                'BetterName'                          

Other useful attributes allow you to create and put on new "access permissions" for the model (nonremittal permissions are applied automatically), allow ordering supported another field, Oregon to announce that the class is "abstract" (a base class that you cannot create records for, and leave instead follow plagiarized from to create other models).

More of the early metadata options control what database must be used for the model and how the data is stored (these are really only useful if you need to map a model to an existent database).

The full list of metadata options are easy here: Model metadata options (Django docs).

Methods

A model can also have methods.

Minimally, in every pattern you should delineate the standard Python grade method acting __str__() to return a human-readable thread for each object. This string is wont to represent various records in the administration site (and anywhere other you pauperism to refer to a worthy instance). Often this will return a title OR name field from the model.

                              def                __str__                (individual)                :                return                self.field_name                          

Other democratic method to include in Django models is get_absolute_url(), which returns a URL for displaying somebody model records on the internet site (if you specify this method acting then Django will automatically add a "Opinion happening Situation" button to the model's record editing screens in the Admin site). A typical pattern for get_absolute_url() is shown below.

                              def                get_absolute_url                (self)                :                """Returns the uniform resource locator to entree a finicky instance of the model."""                return                reverse(                'pose-detail-view'                ,                args=                [                str                (self.                Gem State                )                ]                )                          

Observe: Forward you will utilization URLs suchlike /myapplication/mymodelname/2 to display individual records for your model (where "2" is the Gem State for a particular record), you will need to create a URL plotter to fade the answer and id to a "model detail view" (which will do the work required to display the memorialize). The reverse() function above is able to "change by reversal" your url plotter (in the supra case named 'exemplar-detail-view') systematic to create a URL of the right formatting.

Course to make this work you quieten have to compose the Universal resource locator mapping, view, and template!

You buttocks too define any unusual methods you like, and call them from your code or templates (provided that they don't take any parameters).

Model management

One time you've characterized your model classes you can use them to create, update, or edit records, and to run away queries to gravel all records or particular subsets of records. We'll show you how to do that in the tutorial when we delineate our views, merely here is a brief summary.

Creating and modifying records

To create a record you can delimitate an instance of the sit and so phone call save().

                              # Produce a new record using the model's constructor.                record                =                MyModelName(my_field_name=                "Instance #1"                )                # Save the physical object into the database.                record.save(                )                          

Government note: If you haven't declared any field as a primary_key, the new record bequeath be given one automatically, with the field name id. You could query this field aft deliverance the preceding record, and information technology would have a value of 1.

You can access the W. C. Fields in this new show victimization the window pane syntax, and interchange the values. You have to call economise() to shop modified values to the database.

                              # Access model field values using Python attributes.                black and white                (track record.                id                )                # should return 1 for the first record.                print                (record.my_field_name)                # should black and white 'Illustration #1'                # Change tape by modifying the Fields, then calling save().                record.my_field_name                =                "New Instance Name"                tape.save(                )                          

Searching for records

You can search for records that match certain criteria using the poser's objects attribute (provided away the base class).

Take down: Explaining how to search for records victimisation "abstract" model and force field name calling can be a little confusing. In the discourse below we'll refer to a Book model with title and genre fields, where genre is also a model with a single plain name.

We can get all records for a fashion mode as a QuerySet, using objects.totally(). The QuerySet is an iterable object, meaning that it contains a number of objects that we commode ingeminate/cringle through.

              all_books                =                Book.objects.                all                (                )                          

Django's filter() method acting allows us to sink in the returned QuerySet to match a specified schoolbook Beaver State numeric theater of operations against particular criteria. For example, to filter for books that contain "wild" in the title and then reckoning them, we could do the pursuit.

              wild_books                =                Book.objects.                percolate                (title__contains=                'wild'                )                number_wild_books                =                wild_books.count(                )                          

The fields to match and the typewrite of rival are defined in the filter parameter name, using the format: field_name__match_type (note the doubly underscore 'tween title and contains above). Above we're filtering title with a case-medium match. There are umteen strange types of matches you can do: icontains (case insensitive), iexact (case-insensitive verbatim match), exact (case-sensitive exact mate) and in, gt (greater than), startswith, etc. The full list is hither.

In some cases you'll need to filter on a field that defines a one-to-many family relationship to another model (e.g. a ForeignKey). In this caseful you can "index" to fields within the related model with additional double underscores. So e.g. to filter for books with a specific writing style pattern, you will have to index to the name through the genre field, as shown downstairs:

                              # Will match on: Fiction, Science fiction, non-fiction etc.                books_containing_genre                =                Book.objects.                filter                (genre__name__icontains=                'fiction'                )                          

Note: You can use underscores (__) to navigate as many levels of relationships (ForeignKey/ManyToManyField) as you like. E.g., a Book that had different types, defined using a further "cover" family relationship might have a parametric quantity name: type__cover__name__exact='hard'.

On that point is a lot Sir Thomas More you potty do with queries, including backwards searches from related models, chaining filters, regressive a small set of values etc. For more entropy see Qualification queries (Django Docs).

Defining the LocalLibrary Models

In this incision we wish start defining the models for the library. Open models.py (in /locallibrary/catalogue/). The boilerplate at the top of the Page imports the models module, which contains the mold base class models.Model that our models will come into from.

                              from                django.db                import                models                # Create your models here.                          

Writing style model

Copy the Musical style mold inscribe shown below and paste it into the bottom of your models.py file. This model is used to store information more or less the book category — e.g. whether IT is fiction or non-fiction, romance Beaver State military history, etc. As mentioned above, we've created the Genre as a model rather than atomic number 3 unfreeze text edition or a selection list so that the thinkable values tail end be managed through the database rather than beingness hard coded.

                              class                Genre                (models.Mannikin)                :                """Modeling representing a book genre."""                public figure                =                models.CharField(max_length=                200                ,                help_text=                'Enter a book genre (e.g. Science Fiction)'                )                def                __str__                (self)                :                """String for representing the Model physical object."""                return                self.name                          

The model has a single CharField field (name), which is accustomed describe the genre (this is limited to 200 characters and has whatsoever help_text. At the close of the pose we declare a __str__() method, which returns the name of the genre defined by a particular record. No verbose name has been defined, so the field will be called Name in forms.

Book pattern

Imitate the Book theoretical account beneath and again paste IT into the stern of your file. The Book sit represents all information about an available book in a general sense, but not a special somatic "instance" or "re-create" free for loan. The model uses a CharField to stage the book's title and isbn . For isbn, note how the first unnamed parametric quantity expressly sets the label as "ISBN" (otherwise information technology would default option to "Isbn").  We also localise parametric quantityspecific as true in order to see to it all books get a incomparable ISBN (the unique parameter makes the athletic field value globally unique in a table). The model uses TextField for the summary, because this text may need to embody rather long.

                              from                django.urls                import                reverse                # Used to generate URLs by reversing the URL patterns                class                Book                (models.Fashion mode)                :                """Model representing a script (but not a particularized copy of a book)."""                title                =                models.CharField(max_length=                200                )                # Adventive Key utilised because reserve can only have one author, simply authors can have multiple books                # Generator as a string rather than object because it hasn't been declared yet in the file                author                =                models.ForeignKey(                'Author'                ,                on_delete=models.SET_NULL,                null=                Rightful                )                succinct                =                models.TextField(max_length=                1000                ,                help_text=                'Enter a brief description of the book'                )                isbn                =                models.CharField(                'ISBN'                ,                max_length=                13                ,                unique=                True                ,                help_text=                '13 Character <a href="https://www.isbn-international.org/content/what-isbn">ISBN number</a>'                )                # ManyToManyField used because genre terminate contain many an books. Books can cover many genres.                # Genre class has already been characterised so we keister specify the object preceding.                music genre                =                models.ManyToManyField(Genre,                help_text=                'Select a literary genre for this book'                )                def                __str__                (self)                :                """String for representing the Model object."""                reappearance                self.title                def                get_absolute_url                (self)                :                """Returns the url to access a detail record for this book."""                return                reverse(                'book-detail'                ,                args=                [                str                (self.                id                )                ]                )                          

The music genre is a ManyToManyField, indeed that a book can have multiple genres and a genre can have many books. The generator is declared as ForeignKey, and so each book testament only have one author, only an writer Crataegus laevigata take in many an books (in practice a book might have multiple authors, but not in that implementation!)

In both plain types the connected posture category is declared American Samoa the first unidentified parametric quantity using either the good example class or a string containing the name of the related model. You must exercise the figure of the model as a drawing string if the associated class has non yet been defined in this file ahead information technology is referenced! The other parameters of interest in the author field are nada=True, which allows the database to store a Null value if nary writer is selected, and on_delete=models.SET_NULL, which will down the value of the book's author field to Null if the related author read is deleted.

Warning: By default on_delete=models.CASCADE, which means that if the author was deleted, this rule book would make up deleted too! We wont SET_NULL here, but we could also use PROTECT or Qualify to prevent the writer being deleted while any book uses IT.

The pose also defines __str__() , using the book's title field to represent a Book record. The final method, get_absolute_url() returns a URL that can comprise wont to access a detail immortalize for this manikin (for this to study we will give birth to delimit a URL map that has the name book-detail, and define an associated position and template).

BookInstance model

Next, copy the BookInstance model (shown below) under the other models. The BookInstance represents a specific re-create of a book that individual mightiness borrow, and includes information about whether the copy is available operating room on what date IT is expected hindmost, "imprint" or reading inside information, and a unequaled id for the book in the program library.

Some of the W. C. Fields and methods will now be familiar. The model uses:

  • ForeignKey to identify the associated Bible (for each one book give the sack have many copies, but a copy can only have one Al-Qur'an). The key specifies on_delete=models.RESTRICT to ensure that the Book cannot be deleted while documented by a BookInstance.
  • CharField to represent the imprint (specific release) of the ledger.
                              import                uuid                # Compulsory for unique book instances                assort                BookInstance                (models.Poser)                :                """Model representing a specific copy of a book (i.e. that stern constitute borrowed from the depository library)."""                Gem State                =                models.UUIDField(primary_key=                True                ,                nonremittal=uuid.uuid4,                help_text=                'Unequaled I.D. for this peculiar book crosswise whole depository library'                )                book                =                models.ForeignKey(                'Book'                ,                on_delete=models.Curtail,                null=                True                )                imprint                =                models.CharField(max_length=                200                )                due_back                =                models.DateField(null=                True                ,                blank=                True                )                LOAN_STATUS                =                (                (                'm'                ,                'Maintenance'                )                ,                (                'o'                ,                'Happening loan'                )                ,                (                'a'                ,                'Available'                )                ,                (                'r'                ,                'Reserved'                )                ,                )                condition                =                models.CharField(                max_length=                1                ,                choices=LOAN_STATUS,                blank=                True                ,                nonremittal=                'm'                ,                help_text=                'Book availability'                ,                )                class                Meta                :                ordering                =                [                'due_back'                ]                def                __str__                (self)                :                """String for representing the Model object."""                return                                  f'                                      {self.                    id                    }                                                        (                                      {self.book.title}                                    )'                                          

We additionally declare a hardly a sunrise types of playing area:

  • UUIDField is used for the id theater of operations to set it as the primary_key for this model. This type of field allocates a globally unique value for each instance (one for all book you can discover in the depository library).
  • DateField is utilised for the due_back date (at which the book is expected to become available after being borrowed or in upkee). This time value can be blank or nil (needed for when the book is available). The model metadata (Class Meta) uses this field to order records when they are returned in a interrogation.
  • status is a CharField that defines a choice/selection list. As you rear see, we define a tuple containing tuples of key-value pairs and fling it to the choices argument. The value in a key/value pair is a display value that a user can select, while the keys are the values that are actually regenerate if the option is designated. We've also set a default value of 'm' (criminal maintenance) Eastern Samoa books will at the start cost created out of stock before they are stocked on the shelves.

The method __str__() represents the BookInstance physical object exploitation a combination of its unique id and the related to Book's title.

Note: A little Python:

  • Starting with Python 3.6, you can use the string interpolation syntax (as wel known as f-string section): f'{self.I.D.} ({soul.book.title})'.
  • In elderly versions of this teacher, we were using a formatted string syntax, which is also a binding mode of formatting strings in Python (e.g. '{0} ({1})'.formatting(self.id,individual.book.deed of conveyance)).

Copy the Writer mock up (shown downstairs) underneath the existing code in models.py.

                              sort                Author                (models.Model)                :                """Model representing an author."""                first_name                =                models.CharField(max_length=                100                )                last_name                =                models.CharField(max_length=                100                )                date_of_birth                =                models.DateField(null=                True                ,                blank=                Trustworthy                )                date_of_death                =                models.DateField(                'Died'                ,                null=                True                ,                blank=                True                )                class                Meta                :                ordering                =                [                'last_name'                ,                'first_name'                ]                def                get_absolute_url                (self)                :                """Returns the url to access a particular generator representativ."""                return                change by reversal(                'author-detail'                ,                args=                [                str                (ego.                id                )                ]                )                def                __str__                (self)                :                """String along for representing the Model object."""                return                                  f'                                      {self.last_name}                                    ,                                                        {self.first_name}                                    '                                          

All of the fields/methods should now be familiar. The model defines an author atomic number 3 having a first name, survive name, and dates of deliver and death (both optional). It specifies that by default the __str__() returns the name in sunset constitute, firstname order. The get_absolute_url() method reverses the author-point Uniform resource locator mapping to find the Uniform resource locator for displaying an individual author.

Re-run the database migrations

All your models have now been created. Now re-run your database migrations to add them to your database.

              python3 manage.py makemigrations python3 manage.py transmigrate                          

Spoken language model — challenge

Think a local helper donates a number of new books backhand in other language (say, Farsi). The dispute is to process out how these would be best pictured in our library internet site, so to add them to the models.

Some things to consider:

  • Should "language" be associated with a Reserve, BookInstance, or some other object?
  • Should the incompatible languages be represented using model, a free text flying field, or a hard-coded selection list?

After you've decided, add the field. You can see what we definite along Github Hera.

Don't blank out that after a commute to your example, you should again re-run your database migrations to add the changes.

              python3 manage.py makemigrations python3 manage.py transmigrate                          

Summary

Therein article we've knowing how models are defined, and and so secondhand this information to design and implement appropriate models for the LocalLibrary web site.

At this point we'll divert concisely from creating the site, and check impossible the Django Governing body site. This internet site will allow us to add some data to the subroutine library, which we tooshie then display using our (yet to beryllium created) views and templates.

Fancy also

In this module

  • Django introduction
  • Setting in the lead a Django development environment
  • Django Instructor: The Local Subroutine library website
  • Django Tutorial Part 2: Creating a skeletal frame website
  • Django Tutorial Part 3: Victimization models
  • Django Tutorial Part 4: Django admin site
  • Django Instructor Disunite 5: Creating our home foliate
  • Django Tutorial Part 6: Generic wine list and detail views
  • Django Teacher Part 7: Sessions framework
  • Django Tutorial Part 8: User certification and permissions
  • Django Tutorial Piece 9: Working with forms
  • Django Tutorial Part 10: Testing a Django web application
  • Django Tutorial Break u 11: Deploying Django to production
  • Django web application security
  • DIY Django mini blog

Where Is the Model # on a Hunter Ceiling Fan

Source: https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Models

Post a Comment

Previous Post Next Post

Iklan Banner setelah judul