1

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'
            ]       
Nagaraj Tantri
  • 5,172
  • 12
  • 54
  • 78
vanam
  • 135
  • 1
  • 4
  • 14
  • have you considered a drop down list by putting the following in your model: `usertype= models.IntegerField(choices=CHOICES, default=0)` – Sync Jun 29 '16 at 16:45
  • then make this change: `CHOICES= (('0', 'LinkedinUser'),('1', 'FacebookUser'),)` in your models – Sync Jun 29 '16 at 16:49
  • Thanq it works, i have an other error raised while creating the customuser, can u please have a look on it : https://stackoverflow.com/questions/38150250/how-to-solve-error-raised-no-module-named-django-contrib-customuser – vanam Jul 01 '16 at 16:47

0 Answers0