Django 如何从另一个表中创建具有额外字段(从数据库填充的下拉列表)的注册用户?

Django 如何从另一个表中创建具有额外字段(从数据库填充的下拉列表)的注册用户?,django,Django,我想为用户注册一个额外的字段,该字段将在创建期间从另一个模型中填充,我注册的三个字段是用户名,密码,结构名称,这应该是一个从相关表中获取数据的下拉列表 models.py from django.db import models from django.contrib.auth.models import User from immob.models import Structure from django.db.models.signals import post_save from djan

我想为用户注册一个额外的字段,该字段将在创建期间从另一个模型中填充,我注册的三个字段是
用户名
密码
结构名称
,这应该是一个从相关表中获取数据的下拉列表

models.py

from django.db import models
from django.contrib.auth.models import User
from immob.models import Structure
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
user=models.OneToOneField(User,on_delete=models.CASCADE)
structure=models.ForeignKey(Structure,
on_delete=models.CASCADE,null=True)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
    Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractUser

class Structure(models.Model):
    name = models.CharField(max_length=25)
    def __str__(self):
        return self.name


class CustomUser(AbstractUser):
    structure = models.ForeignKey(Structure, on_delete=models.CASCADE, null=True)
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser, Structure


class UserCreateForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ("username", "structure", "password1", "password2")
from .forms import UserCreateForm
from django.urls import reverse_lazy
from django.views import generic

class SignUp(generic.CreateView):
    form_class = UserCreateForm
    success_url = reverse_lazy('login')
    template_name = 'app/signup.html'

工作示例

首先,您需要使用django来扩展
User
模型,而不是使用
OnetoOnefield

Models.py

from django.db import models
from django.contrib.auth.models import User
from immob.models import Structure
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
user=models.OneToOneField(User,on_delete=models.CASCADE)
structure=models.ForeignKey(Structure,
on_delete=models.CASCADE,null=True)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
    Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractUser

class Structure(models.Model):
    name = models.CharField(max_length=25)
    def __str__(self):
        return self.name


class CustomUser(AbstractUser):
    structure = models.ForeignKey(Structure, on_delete=models.CASCADE, null=True)
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser, Structure


class UserCreateForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ("username", "structure", "password1", "password2")
from .forms import UserCreateForm
from django.urls import reverse_lazy
from django.views import generic

class SignUp(generic.CreateView):
    form_class = UserCreateForm
    success_url = reverse_lazy('login')
    template_name = 'app/signup.html'
然后在
设置.py
中,您需要指向将用作身份验证模型的模型,以便对用户进行身份验证并创建身份验证模型。因此,请将此添加到
设置中

AUTH\u USER\u MODEL='core.CustomUser'

要创建用户,我们只需使用预先提供的方法调用。现在使用Abstractuser的好处是您不需要实现
ModelChoiceField

Forms.py

from django.db import models
from django.contrib.auth.models import User
from immob.models import Structure
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
user=models.OneToOneField(User,on_delete=models.CASCADE)
structure=models.ForeignKey(Structure,
on_delete=models.CASCADE,null=True)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
    Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractUser

class Structure(models.Model):
    name = models.CharField(max_length=25)
    def __str__(self):
        return self.name


class CustomUser(AbstractUser):
    structure = models.ForeignKey(Structure, on_delete=models.CASCADE, null=True)
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser, Structure


class UserCreateForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ("username", "structure", "password1", "password2")
from .forms import UserCreateForm
from django.urls import reverse_lazy
from django.views import generic

class SignUp(generic.CreateView):
    form_class = UserCreateForm
    success_url = reverse_lazy('login')
    template_name = 'app/signup.html'
Views.py

from django.db import models
from django.contrib.auth.models import User
from immob.models import Structure
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
user=models.OneToOneField(User,on_delete=models.CASCADE)
structure=models.ForeignKey(Structure,
on_delete=models.CASCADE,null=True)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
    Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractUser

class Structure(models.Model):
    name = models.CharField(max_length=25)
    def __str__(self):
        return self.name


class CustomUser(AbstractUser):
    structure = models.ForeignKey(Structure, on_delete=models.CASCADE, null=True)
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser, Structure


class UserCreateForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ("username", "structure", "password1", "password2")
from .forms import UserCreateForm
from django.urls import reverse_lazy
from django.views import generic

class SignUp(generic.CreateView):
    form_class = UserCreateForm
    success_url = reverse_lazy('login')
    template_name = 'app/signup.html'
app/signup.html

<h2>Sign up</h2>
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Sign up</button>
</form>
注册
{%csrf_令牌%}
{{form.as_p}}
注册

django生成的简单表单,然后将所有这些与URL连接起来,您就可以开始了。

但我在Immob应用程序中有models.py,编写的模型在compte应用程序中#创建您的模型在这里类结构(models.Model):结构代码=models.CharField(max_length=1)结构设计=models.CharField(max_length=350)类服务(models.Model):结构id=models.ForeignKey(结构,on_delete=models.CASCADE,null=True)服务设计=models.CharField(max_length=350)相关型号代码是否在其他应用程序中并不重要,虽然您的导入是正确的,但您应该能够在注册时在下拉列表中看到数据。不,我试图了解如何做到这一点,因为有一个特定的逻辑,我不需要解释所有逻辑来正确理解我,在stackoverflow中,我无法放置所有代码,因为它是有限的。您可以在此处解释所有逻辑,这就是堆栈溢出存在的原因。用完整的逻辑编辑你的问题。