How can i pass custom object to form using Django

泄露秘密 提交于 2019-12-24 07:58:06

问题


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...


回答1:


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


来源:https://stackoverflow.com/questions/50351621/how-can-i-pass-custom-object-to-form-using-django

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!