Python 如何在django中使用auth_用户模型和cutom模型字段创建自定义注册表

Python 如何在django中使用auth_用户模型和cutom模型字段创建自定义注册表,python,django,forms,django-registration,Python,Django,Forms,Django Registration,我是django的新手,我有自定义的用户模型,带有额外的状态和标题模型。到目前为止,我已经完成了数据库部分,如何使用foreignkey字段为cutom用户模型创建注册表。 我的车型类别代码: from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save from django.contrib.auth.models i

我是django的新手,我有自定义的用户模型,带有额外的状态和标题模型。到目前为止,我已经完成了数据库部分,如何使用foreignkey字段为cutom用户模型创建注册表。 我的车型类别代码:

from django.db import models
from django.contrib.auth.models import User
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)

class Meta:
    db_table = 'title'

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

class Meta:
    db_table = 'status'

class User(AbstractUser):

filenumber = models.CharField(max_length=9, null=True, blank=True)
personalemail = forms.EmailField(required=True)
intakeyear = models.IntegerField(null=True, blank=True)
title = models.ForeignKey(Title, on_delete=models.CASCADE, null=True, blank=True)
status = models.ForeignKey(Status, on_delete=models.CASCADE, null=True, blank=True)
My settings.py:

AUTH_USER_MODEL = 'student.User'# changes built-in user model to ours
如何创建用户注册表单字段,如 名字、姓氏、标题、状态、电子邮件、个人电子邮件、密码、密码确认。我在用户模型标题和状态(foreignkey字段)以及文件号、intakeyear和personalemail中添加了额外的字段

My form.py文件:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.forms import ModelForm

from student.models import User
from student.models import Title, Statu

class StudentNewRegistrationForm(forms.ModelForm):
title = forms.CharField(required=True)
intakeyear = forms.IntegerField(required=True)
email = forms.EmailField(required=True)
personalemail = forms.EmailField(required=True)
status = forms.CharField(required=True)


def __init__(self, *args, **kwargs):
    super(StudentNewRegistrationForm, self).__init__(*args, **kwargs)
    title = [('', 'Choose a title')]
    title.extend(Title.objects.values_list('id', 'value'))
    self.fields['title'] = forms.ChoiceField(choices=title)

    status = [('', 'Choose a status')]
    status.extend(Status.objects.values_list('id', 'value'))
    self.fields['status'] = forms.ChoiceField(choices=status)

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

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

    if commit:
        user.save()
    return user
views.py:

from django.shortcuts import render, redirect
from django.urls import reverse
from django.contrib.auth.models import User
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required
from .forms import StudentNewRegistrationForm

def student_new_registration(request):
  if request.method == 'POST':
    form = StudentNewRegistrationForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect(reverse('student:home'))

else:
    form = StudentNewRegistrationForm()

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

{% extends 'base.html' %}

{% block head %}
<title>Student Registration&nbsp Form</title>
{% endblock %}

{% block body %}
<div class="container">
<form method="post">
    {% csrf_token %}
    <div class="row">
    <div class="col-sm-4">
         <h3> Student&nbsp;Registration&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.firstname.label }}</div>
        <div class="col-sm-3">{{ form.firstname }}</div>
        <div class="col-sm-4">{{ form.firstname.errors }}</div>
    </div>
     <br>
    <div class="row">
        <div class="col-sm-2">{{ form.lastname.label }}</div>
        <div class="col-sm-3">{{ form.lastname }}</div>
        <div class="col-sm-4">{{ form.lastname.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>
    <div class="row">
        <div class="col-sm-2">{{ form.personalemail.label }}</div>
        <div class="col-sm-3">{{ form.personalemail }}</div>
        <div class="col-sm-4">{{ form.personalemail.errors }}</div>
    </div>
    <br>

    <br>
    <div class="row">
        <div class="col-sm-2">{{ form.intakeyear.label }}</div>
        <div class="col-sm-3">{{ form.intakeyear }}</div>
        <div class="col-sm-4">{{ form.intakeyear.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 %}

请帮助我提前感谢任何人

因为
标题
状态
模型的字段是
外国
您应该使用
模型选择字段
而不是
选择字段

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

    self.fields['status'] = forms.ModelChoiceField(queryset=Status.objects.all(), empty_label='Choose a status')
要显示值而不是ID,只需将
\uu str\uuu()
方法添加到
Status
Title
模型:

class Title(models.Model):
    ...
    def __str__(self):
        return.self.value

class Status(models.Model): 
    ...
    def __str__(self):
        return.self.value 

由于
title
status
模型的字段是
ForeignKyy
您应该使用
modelcoocefield
而不是像这样使用
ChoiceField

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

    self.fields['status'] = forms.ModelChoiceField(queryset=Status.objects.all(), empty_label='Choose a status')
要显示值而不是ID,只需将
\uu str\uuu()
方法添加到
Status
Title
模型:

class Title(models.Model):
    ...
    def __str__(self):
        return.self.value

class Status(models.Model): 
    ...
    def __str__(self):
        return.self.value 

感谢您的快速回复@Neverballanner我在/student/studentnewregistration/“first_name”处收到错误密钥error这里我使用默认的auth_用户字段和外键字段我可以在我的表单中定义auth_用户字段吗?否则它将调用Defualt抱歉,我犯了一个错误现在工作正常@Neverballanner非常感谢兄弟... 谢谢你的快速回复@NeverballOner我在/student/studentnewregistration/“first_name”处收到错误密钥error这里我使用默认的auth_用户字段和外键字段我可以在我的表单中定义auth_用户字段吗?或者它会调用Defualt抱歉我犯了一个错误现在工作正常@NeverballOner非常感谢谢谢你兄弟我这样做