jcugat / django-custom-user

Custom user model for Django with the same behaviour as the default User class but with email instead of username.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Prevent user registration - when any UserProfile filed is invalid

ra00f opened this issue · comments

commented

Hello,

I'm trying to use django-registration-redux along with custom_user. I have added both apps to settings.py

My main urls.py is as given below

from userprofile.forms import UserProfileForm
from registration.backends.default.views import RegistrationView
urlpatterns = [
url(r'user/register/$', 
        RegistrationView.as_view(form_class = UserProfileForm), 
        name = 'registration_register'),

    url(r'^user/', include('registration.backends.default.urls')),
]

I have a UserProfile model as given below. (userprofile/models.py)

def validate_dob(value):
    now=timezone.now()
    start_date=date(now.year-settings.AGE_UPPER, 1, 1)
    end_date=date(now.year-settings.AGE_LOWER, 12, 31)
    print("start: %s end: %s supplied :%s" % (start_date, end_date, value))
    if start_date >value or value > end_date:
            raise ValidationError("Please choose a valid date from the given set") 
#----------------------------------------
class UserProfile(models.Model):
    user=models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
        primary_key=True,)
    fullname=models.CharField(max_length=70, blank=False)
    dob=models.DateField(blank=False,validators=[validate_dob] )
    photo=models.ImageField(upload_to='profile_images', blank=False)
    def __str__(self):
        return self.user.email
    def get_profile(self):
        return self.user.id
#-------------------------------------
def user_registered_callback(sender, user, request, **kwargs):
    #print(user.email)
    profile = UserProfile(user = user)
    print(request.POST)
    profile.fullname =request.POST["fullname"]
    profile.dob ="%s-%s-%s" % (request.POST["dob_year"],request.POST["dob_month"],request.POST["dob_day"])
    #profile.dob=request.POST["dob"]
    if 'photo' in request.FILES:
        profile.photo = request.FILES['photo']

    profile.save()

user_registered.connect(user_registered_callback)

and here's my userprofile/forms.py

class UserProfileForm(RegistrationForm):
    fullname=forms.CharField(required=True,label="Full name",  min_length=3, max_length=75)
    dob=forms.DateField(required=True,label="Date of birth", 
        widget=forms.SelectDateWidget(years=range(now.year-settings.AGE_UPPER,now.year-settings.AGE_LOWER)))

    photo=forms.ImageField(required=True)`

How do I prevent inserting User values into the table if the filed, say dob is not in the specified range (AGE_UPPER=70 ,AGE_LOWER=18)

Please tell me if I'm making this over complicated.

Thanks

This should be a question for django-registration-redux or the django-users mailing list, since django-custom-user is not doing anything here and I've never used django-registration-redux myself.

Anyway I did a quick look and it seems the problem is that your UserProfileForm is not using the validator that you created. You should put validators=[validate_dob] in the dob field of the form like this:

from .models import validate_dob

class UserProfileForm(RegistrationForm):
    fullname=forms.CharField(required=True,label="Full name",  min_length=3, max_length=75)
    dob=forms.DateField(validators=[validate_dob], required=True,label="Date of birth", 
        widget=forms.SelectDateWidget(years=range(now.year-settings.AGE_UPPER,now.year-settings.AGE_LOWER)))

    photo=forms.ImageField(required=True)`

Hope it helps