ilidream
ilidream

Reputation: 103

override django-allauth default forms

I want to override the default forms of django-allauth in order to change\add default widget attributes, class variables without changing the initial code of allauth form. How can I do that?

My workspace:
1) installed django-allauth, as a package through pip;
2) configured settings, according to the recommendations of the project on github;
3) locally created templates signin, signup;
4) created forms.py, which defines a child class forms django-allauth

from allauth.account import SigninForm

class mySigninForm (SigninForm):
     username = ...//override variable

Is this right way?

Thanks!

Upvotes: 6

Views: 4081

Answers (2)

Andrew E
Andrew E

Reputation: 8337

You can override any (or all) of the allauth default templates by creating your own tree of template files.

The naming of the hierarchy must match allauth, e.g. this is from my project:

allauthdemo/templates/
├── allauth
│   ├── account
│   └── socialaccount
├── my
├── other
├── template
└── dirs

The template settings in settings.py must include those dirs, e.g.:

TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [
        os.path.join(BASE_DIR, 'allauthdemo', 'templates', 'allauth'),
        os.path.join(BASE_DIR, 'allauthdemo', 'templates'),
    ],
    ...

This allauth demo on github shows how to do it. Disclaimer: I wrote that demo.

Upvotes: 0

Amyth
Amyth

Reputation: 32959

If you'd like to use the methods or functionalities provided by the allauth forms then overriding the form classes like you currently are is your best bet.

from allauth.account.forms import LoginForm
from django import forms
from myapp.forms import widgets


class MyLoginForm(LoginForm):

    // Override attributes
    existing_field = forms.CharField(widget=widgets.CustomWidget())

    // Add Custom Attributes
    new_field = forms.CharField(widget=widgets.CustomWidget())

If you want a completely custom form, you can use a custom django form and then use it in the view. For Example:

forms

from django import forms
from myapp.forms import widgets

class MyLoginForm(forms.Form):
    // Add atributes and methods
    some_field = forms.CharField(widget=widgets.CustomWidget())

views

from django.views.generic.edit import FormView
from myapp.forms import MyLoginForm

LoginUser(FormView):
    form = MyLoginForm

Upvotes: 4

Related Questions