如何使用Django将自定义对象传递给表单 [英] How can i pass custom object to form using Django

查看:92
本文介绍了如何使用Django将自定义对象传递给表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是django的新手,我创建了自定义用户(auth_user)模型.我需要根据我的自定义对象使用自定义用户模型创建学生注册表格

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

我有两个模型Title,用户是这样的:

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:

settings.py:

AUTH_USER_MODEL = 'student.User'

这里我有ForeignKey标题字段和用户默认字段first_name,last_name,email,password

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

我的forms.py:

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

这里我有如下所示的api响应:

Here i have api response like below:

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

此回复来自studentregistrationview:

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视图,我试图创建如下所示的新User对象

student_new_registration view i tried to create new User object like below

student_new_registration.py:

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)

错误:

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

studentnewregistrationform.html:

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

推荐答案

您需要在views.py文件以及使用User类的任何其他文件中更改User模型.到新的模型.为此,请尝试添加以下导入:

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()

代替

from django.contrib.auth.models import User

这篇关于如何使用Django将自定义对象传递给表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆