1

I am new to django, I created my custom user(auth_user) model. I need to create student registration form using custom user model according to my custom object

I have two models Title, User like this:

from django.db import models
#from django.contrib.auth.models import User
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.contrib.auth.models import AbstractUser

class Title(models.Model):
value = models.CharField(max_length=100, null=True, blank=True)

def __str__(self):
    return self.value

class Meta:
    db_table = 'title'

class User(AbstractUser):
title = models.ForeignKey(Title, on_delete=models.CASCADE, null=True, blank=True)
class Meta:
    db_table = 'user'

settings.py:

AUTH_USER_MODEL = 'student.User'

Here i have ForeignKey title field and User default fields first_name, last_name, email,password

My forms.py:

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.core import validators
from student.models import User
from student.models import Title

class StudentRegistrationForm(forms.Form):
filenumber = forms.CharField(label='Filenumber', max_length=45)

class StudentNewRegistrationForm(forms.ModelForm):

title = forms.CharField(required=True)
username = forms.CharField(required=True)
first_name = forms.CharField(required=True)
last_name = forms.CharField(required=True)
email = forms.EmailField(required=True)
password1 = forms.CharField(required=True)
password2 = forms.CharField(required=True)


def __init__(self, *args, **kwargs):
    super(StudentNewRegistrationForm, self).__init__(*args, **kwargs)
    self.fields['title'] = forms.ModelChoiceField(queryset=Title.objects.all(), empty_label='Choose a title',required=False)

class Meta:
    model = User
    fields = ['title','username', 'first_name', 'last_name','email' 'password1', 'password2']

def save(self, commit=True):
    user = super(StudentNewRegistrationForm, self).save(commit=False)
    user.username = self.cleaned_data['username']
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']
    user.email = self.cleaned_data['email']
    user.title = self.cleaned_data['title']
    user.password1 = user.set_password(self.cleaned_data['password1'])
    user.password2 = user.set_password(self.cleaned_data['password2'])

    if commit:
        user.save()
    return user

Here i have api response like below:

{"candidate":{"firstname":"Testuser","lastname":"test","salutation":10000,"email":"testing@gmail.com","username":"test"}}

This response coming form studentregistrationview:

from django.shortcuts import render, redirect
from django.urls import reverse
from student.forms import RegistrationForm
from django.contrib.auth import get_user_model
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required
from .forms import StudentRegistrationForm, StudentNewRegistrationForm
import requests
from django.http import JsonResponse
from django.http import HttpResponse
#from django.contrib.auth import get_user_model
from student.models import User
from student.models import Title
import json
import urllib
from django.conf import settings
from django.contrib import messages

def studentregistration(request):
form = StudentRegistrationForm()
if request.method == 'POST':
    form = StudentRegistrationForm(request.POST)
    if form.is_valid():
        data = form.cleaned_data
        inputdata = data.get('filenumber')
        url = 'https://myapiurl/' + inputdata
        result = requests.get(url)
        finalresult = result.json()
        studentapires = {'studentres': finalresult}
        request.session['studentapires'] = studentapires
        return redirect('/student/studentnewregistration')

else:
    form = StudentRegistrationForm()
return render(request, 'student/studentregister.html', {'form': form})

I am creating new user object like below and i tried to persist object, here issue object is not persisting to user table

student_new_registration view i tried to create new User object like below

student_new_registration.py:

def student_new_registration(request):
studentapires = request.session.get('studentapires', None)
jsonresult = studentapires['studentres']['candidate']
user = User()

if jsonresult['salutation'] == 100000000:
    salutation = 'Mister'
elif jsonresult['salutation'] == 100000002:
    salutation = 'Madam'

title = Title.objects.get(value=salutation)
user.title = title
user.first_name = jsonresult['firstname']
user.last_name = jsonresult['lastname']
user.email = jsonresult['email']
user.username = jsonresult['username']

if request.method == 'POST':
    form = StudentNewRegistrationForm(request.POST, instance=user)
    if form.is_valid():
        form.save()
        return HttpResponse("Registration Completed")
    return HttpResponse("Please Check Your Registration Form")

else:
    form = StudentNewRegistrationForm(instance=user)
    args = {'form': form}
    return render(request, 'student/studentnewregistrationform.html', args)

Error:

full_clean() missing 1 required positional argument: 'self', form is not submitting (means form not going inside form.is_valid())

studentnewregistrationform.html:

{% extends 'base.html' %}

{% block head %}
<title>Student Profile Form</title>
{% endblock %}

{% block body %}
<div class="container">
<form method="post">
    {% csrf_token %}
    <div class="row">
    <div class="col-sm-4">
         <h3> Student&nbsp;Profile&nbsp;Form</h3>
    </div>
    </div>
    <br>

    <div class="row">
        <div class="col-sm-2">{{ form.title.label }}</div>
        <div class="col-sm-3">{{ form.title }}</div>
        <div class="col-sm-4">{{ form.title.errors }}</div>
    </div>
     <br>
    <div class="row">
        <div class="col-sm-2">{{ form.first_name.label }}</div>
        <div class="col-sm-3">{{ form.first_name }}</div>
        <div class="col-sm-4">{{ form.first_name.errors }}</div>
    </div>
     <br>
    <div class="row">
        <div class="col-sm-2">{{ form.last_name.label }}</div>
        <div class="col-sm-3">{{ form.last_name }}</div>
        <div class="col-sm-4">{{ form.last_name.errors }}</div>
    </div>
    <br>
    <div class="row">
        <div class="col-sm-2">{{ form.email.label }}</div>
        <div class="col-sm-3">{{ form.email }}</div>
        <div class="col-sm-4">{{ form.email.errors }}</div>
    </div>
    <br>
    <br>
    <div class="row">
        <div class="col-sm-2">{{ form.username.label }}</div>
        <div class="col-sm-3">{{ form.username }}</div>
        <div class="col-sm-4">{{ form.username.errors }}</div>
    </div>
    <br>
    <div class="row">
        <div class="col-sm-2"><label for="{{ form.password1.label }}">Password</label></div>
        <div class="col-sm-3">{{ form.password1 }}</div>
        <div class="col-sm-4">{{ form.password1.errors }}</div>
    </div>
    <br>
   <div class="row">
        <div class="col-sm-2"><label for="{{ form.password2.id_for_label }}">ConfirmPassword</label></div>
        <div class="col-sm-3">{{ form.password2 }}</div>
        <div class="col-sm-4">{{ form.password2.errors }}</div>
    </div>
    <br><br>
    <div class="row">
        <div class="col-sm-2 col-sm-offset-2"> <input type="submit" name="submit" value="Submit" class="btn btn-primary"/></div>
        <div class="col-sm-2"></div>
    </div>
</form>
</div>
{% endblock %}

here issue is i am able to render all fields to registration form but i am not able to persist data and while persisting custom object i am getting this error

Manager isn't available; 'auth.User' has been swapped for 'student.User'

please help me any one, Thanks in advance...

somesh
  • 528
  • 2
  • 10
  • 26

1 Answers1

0

You need to change User model inside your views.py file and in any other files where you are using User class. To new model. For this try to add following import:

from django.contrib.auth import get_user_model
User = get_user_model()

Instead of

from django.contrib.auth.models import User
neverwalkaloner
  • 46,181
  • 7
  • 92
  • 100
  • i edit my view like above can you look at above my view still i am getting error full_clean() missing 1 required positional argument: 'self' – somesh May 16 '18 at 06:37
  • @somesh can you add full traceback? – neverwalkaloner May 16 '18 at 06:40
  • i added code briefly, please look above post @neverwalkaloner – somesh May 16 '18 at 07:01
  • @somesh you shouldn't use `User` as instance. Your code shodn't be changed except import. You have to replace only this line: `from django.contrib.auth.models import User`. So return to the previous version any other part of code. – neverwalkaloner May 16 '18 at 07:07
  • this is my entire code you mean i should change my form also instead of (meta) User to get_user_model, otherwise how can i persist new object (inside view) to User model @neverwalkaloner – somesh May 16 '18 at 07:16
  • @somesh you need to set `AUTH_USER_MODEL` setting: https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#reusable-apps-and-auth-user-model After this `get_user_model` will return your custom model. – neverwalkaloner May 16 '18 at 07:17
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/171128/discussion-between-somesh-and-neverwalkaloner). – somesh May 16 '18 at 07:18
  • already i mentioned my settings.py file please check my entire post once @neverwalkaloner – somesh May 16 '18 at 07:21