I am new to django, trying to create a custom registration form. I wanted to add a radio button in the user registration to know whether the user is giving a facebook id or linkedin id. Please help me in completing this.
in my models.py
from django.db import models
from django.contrib.auth.models import User, BaseUserManager, AbstractUser
class Registration(models.Model):
u = models.BooleanField(default=False)
model = User
def __unicode__(self):
return self.u
class CustomUserManager(BaseUserManager):
def create_user(self, u ):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
u = models.BooleanField('u:')
model = User
user = self.model(
u = u
)
user.save(using=self._db)
return user
def create_superuser(self, u):
"""
Creates and saves a superuser with the given email, date of
birth and password.
"""
user = self.create_user(
u,
)
user.is_admin = True
user.save(using=self._db)
return user
class CustomUser(AbstractUser):
objects = CustomUserManager()
pass
class LinkedInUser(CustomUser):
linkedin_id = models.CharField(max_length=30, unique=True)
class Meta:
verbose_name = 'LinkedIn User'
class FacebookUser(CustomUser):
facebook_id = models.CharField(max_length=30, unique=True)
class Meta:
verbose_name = 'Facebook User
in my forms.py
from django import forms
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from .models import CustomUser, LinkedInUser, FacebookUser
import re
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth import get_user_model
class RegistrationForm(forms.ModelForm):
username = forms.RegexField(regex=r'^\w+$', widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("username"), error_messages={ 'invalid': _("This value must contain only letters, numbers and underscores.") })
email = forms.EmailField(widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("Email address"))
password1 = forms.CharField(widget=forms.PasswordInput(attrs=dict(required=True, max_length=30, render_value=False)), label=_("Password"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs=dict(required=True, max_length=30, render_value=False)), label=_("Password (again)"))
CHOICES = (
('LinkedInUser', 'LinkedInUser'),
('FacebookUser', 'FacebookUser'),
)
u = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
# _ = forms.TypedChoiceField(
# coerce=lambda x: x == 'True',
# choices=((LinkedInUser, 'LinkedInUser'), (FacebookUser, 'FacebookUser')),
# widget=forms.RadioSelect
# )
class Meta :
User = get_user_model()
def clean_name(self):
try:
user = User.objects.get(username__iexact=self.cleaned_data['username'])
except User.DoesNotExist:
return self.cleaned_data['username']
raise forms.ValidationError(_("The username already exists. Please try another one."))
def clean(self):
if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
if self.cleaned_data['password1'] != self.cleaned_data['password2']:
raise forms.ValidationError(_("The two password fields did not match."))
return self.cleaned_data
class CustomUserCreationForm(UserCreationForm):
def clean_username(self):
# Since User.username is unique, this check is redundant,
# but it sets a nicer error message than the ORM. See #13147.
username = self.cleaned_data["username"]
try:
CustomUser._default_manager.get(username=username)
except CustomUser.DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate_username'])
class LinkedInUserCreationForm(UserCreationForm):
linkedin_id = forms.CharField(label="LinkedIn Id", max_length=30, required=True,
help_text="Required. 30 characters or fewer.")
class Meta:
User = get_user_model()
model = LinkedInUser
fields = [
'linkedin_id'
]
class FacebookUserCreationForm(UserCreationForm):
facebook_id = forms.CharField(label="Facebook Id", max_length=30, required=True,
help_text="Required. 30 characters or fewer.")
class Meta:
User = get_user_model()
model = FacebookUser
fields = [
'facebook_id'
]