簡體   English   中英

我如何使用Django將自定義對象傳遞給表單

[英]How can i pass custom object to form using Django

我是django的新手,我創建了自定義用戶(auth_user)模型。 我需要根據我的自定義對象使用自定義用戶模型創建學生注冊表格

我有兩個模型標題,用戶是這樣的:

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'

在這里,我有ForeignKey標題字段和用戶默認字段first_name,last_name,email,password

我的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響應:

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

這個回應來自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})

我正在創建新的用戶對象,如下所示,但我嘗試保留對象,此處問題對象未保留到用戶表中

student_new_registration視圖我試圖創建新的User對象,如下所示

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:

{% 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 %}

這里的問題是我能夠將所有字段呈現為注冊表單,但是我無法持久保存數據,而在持久保存自定義對象時出現此錯誤

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

請任何人幫助我,在此先感謝...

您需要在views.py文件以及使用User類的任何其他文件中更改User模型。 到新模型。 為此,請嘗試添加以下導入:

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

代替

from django.contrib.auth.models import User

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM