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中,我无法放置所有代码,因为它是有限的。您可以在此处解释所有逻辑,这就是堆栈溢出存在的原因。用完整的逻辑编辑你的问题。