Custom Signup View in django-allauth
Tags: django, python, authentication
Published: 2020-10-26 13:46:58

---
title: Custom Signup View in django-allauth
published: true
date: 2020-06-16 00:00:00 UTC
tags: django, python, authentication
canonical_url: https://tech.serhatteker.com/post/2020-06/custom-signup-view-in-django-allauth/
---

**[django-allauth]** is a great 3rd party library for **Django** which is integrated set of **Django** applications addressing authentication, registration, account management as well as 3rd party (social) account authentication.

It comes with great set of `views`, `templates` etc. If you want to override their default `templates` add `<projectname>/templates/account/<template_name.html>` in your project and write your custom page.

However if you want to change this default `templates/account/` `$path` or add some custom _logic_ in your `views`, you need more than that.

In this article we will see to use different `template` and  `path` for `Signup`.

## 0 Initials
These are the initials you need before using the article.

### 0.0 requirements.txt
You installed necessary `pip` _packages_:

```
# requirements.txt
django==3.1
django-allauth==0.42.0
```

> Info 
> Your versions may differ but I mention versions to point references.

### 0.1 Project Setup

1. You created your __Django__ project:

    ```bash
    $ django-admin startproject <projectname> # let it be djauth
    $ ./manage.py startapp apps
    $ ./manage.py startapp users
    ```

    Your _app_'s name may be different and you don't need `users` _app_ however
    it is a good convention to manage your users in a different _app_.

    So your _project_ directory should look like this:

    ```
    .
    ├── djauth
    │   ├── apps
    │   │   ├── admin.py
    │   │   ├── apps.py
    │   │   ├── __init__.py
    │   │   ├── migrations
    │   │   │   └── __init__.py
    │   │   ├── models.py
    │   │   ├── tests.py
    │   │   └── views.py
    │   ├── djauth
    │   │   ├── asgi.py
    │   │   ├── __init__.py
    │   │   ├── __pycache__
    │   │   │   ├── __init__.cpython-38.pyc
    │   │   │   └── settings.cpython-38.pyc
    │   │   ├── settings.py
    │   │   ├── urls.py
    │   │   └── wsgi.py
    │   ├── manage.py
    │   ├── requirements.txt
    │   ├── templates
    │   │   ├── apps
    │   │   └── users
    │   └── users
    │       ├── admin.py
    │       ├── apps.py
    │       ├── __init__.py
    │       ├── migrations
    │       │   └── __init__.py
    │       ├── models.py
    │       ├── tests.py
    │       └── views.py
    ├── .gitignore
    ├── Session.vim
    └── tags

    10 directories, 26 files
    ```


2. You installed and configured `django-allauth` as detailed here: [django-allauth installation]

## 1 The Magic
Now let's code the custom `Signup` we want:

### 1.0 Views
First extend/override `django-allauth`'s `SignupView`:

`djauth/users/views.py`

```python
from allauth.account.views import SignupView


class AccountSignupView(SignupView):
    # Signup View extended

    # change template's name and path
    template_name = "users/custom_signup.html"

    # You can also override some other methods of SignupView
    # Like below:
    # def form_valid(self, form):
    #     ...
    #
    # def get_context_data(self, **kwargs):
    #     ...


account_signup_view = AccountSignupView.as_view()
```

### 1.1 URLs
`djauth.users.urls.py` file:

```python
from django.urls import include, path
from .views import account_signup_view

urlpatterns = [
    ...
    # override the SignupView of django-allauth
    path("accounts/signup/", view=account_signup_view),
    # this is the default config for django-allauth
    path("accounts/", include("allauth.urls")),
    ...
]
```

### 1.2 Template

You can use your own page but I'll give a custom_signup.html` page as an example:

`djauth/templates/users/custom_signup.html`


<pre>


```jinja
{% extends "users/base.html" %}

{% load i18n %}

{% block head_title %}{% trans "Signup" %}{% endblock %}

{% block inner %}
<h1>{% trans "Sign Up" %}</h1>

<p>{% blocktrans %}Already have an account? Then please <a href="{{ login_url }}">sign in</a>.{% endblocktrans %}</p>

<form class="signup" id="signup_form" method="post" action="{% url 'account_signup' %}">`
   {% csrf_token %}
   {{ form }}
   {% if redirect_field_value %}`
    <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
   {% endif %}
  <button class="btn btn-primary" type="submit">{% trans "Sign Up" %} &raquo;</button>
</form>

{% endblock %}
```

</pre>



Now you can use different `template` and `path` for `Signup`.

All done!

[django-allauth]: https://github.com/pennersr/django-allauth
[django-allauth installation]: https://django-allauth.readthedocs.io/en/latest/installation.html#
[django-allauth templates]: https://github.com/pennersr/django-allauth/blob/master/allauth/templates/account/