2. How to use your own addressmodel

(Instead of the default one)

Some people might feel like the current addressmodel is not suitable for their project. You might be using a “client” + address model from an external application or simply want to write your own.

This is a rather advanced use case, and most developers should hopefully be happy with the default model. It is however relatively easy to do.

2.1. Deactivate the default addressmodel

Simple enough: just remove or comment the corresponding entry in your project’s INSTALLED_APPS:

INSTALLED_APPS = (
...
'shop', # The django SHOP
#'shop.addressmodel', # <-- Comment this out
...
)

2.2. Hook your own model to the shop

To achieve this, simply add a SHOP_ADDRESS_MODEL to your settings file, and give the full python path to your Address model as a value:

SHOP_ADDRESS_MODEL = 'myproject.somepackage.MyAddress'

Your custom model must unfortunately have the following two fields defined for the checkout views to work:

user_shipping = models.OneToOneField(User, related_name='shipping_address', blank=True, null=True)
user_billing = models.OneToOneField(User, related_name='billing_address', blank=True, null=True)

This is to ensure that the views take handle “attaching” the address objects to the User (or the session if the shopper is a guest).

We recommend adding the as_text() method to your address model. This ‘collects’ all fields and returns them in one string. This string will be saved to the order (to billing_address_text or shipping_address_text accordingly) during checkout view.

You are obviously free to subclass these views and hook in your own behavior.