python - 使用 django-allauth 在用户注册时创建用户和用户配置文件
问题描述
我正在使用 django-allauth 来获取帐户、登录、注销、注册,但我需要在创建时用户必须创建一个配置文件,并且我正在使用模型 UserProfile,因为它可以在代码中看到。问题是,当我创建自定义注册表单时,它现在创建了一个具有 [用户名、电子邮件、名字、姓氏、密码] 的用户,但它没有创建用户配置文件。我有三个问题:
- 如何在注册时创建用户和用户配置文件?
- 如何为 django-allauth 附带的表单添加样式,即在 /accounts /login/
- 我该如何修改,以便当用户登录时,它将他重定向到 /profiles/ 而不是 /accounts/profiles 或者就 REST 原则而言更好的是 /accounts/profiles/ 如果是的话,那么有可能吗修改配置文件应用程序,以便它可以使用 django-allauth 视图?
我的自定义注册表单:
# django_project/profiles/forms.py
from django import forms
from allauth.account.forms import SignupForm
class CustomSignupForm(SignupForm):
first_name = forms.CharField(max_length=30, label='First Name')
last_name = forms.CharField(max_length=30, label='Last Name')
bio = forms.CharField(max_length=255, label='Bio')
def save(self, request):
user = super(CustomSignupForm, self).save(request)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.bio = self.cleaned_data['bio']
user.save()
return user
设置:
# django_project/django_project/settings.py
ACCOUNT_FORMS = {
'signup': 'profiles.forms.CustomSignupForm',
}
和主要网址模式:
# django_project/django_project/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('profiles/', include('profiles.urls')),
path('accounts/', include('allauth.urls')),
]
配置文件应用程序中的网址模式:
# django_project/profiles/urls.py
app_name = 'profiles'
urlpatterns = [
path('<str:user>/', ProfileView.as_view(), name='profile-detail'),
]
这是我的 ProfileView:
class ProfileView(LoginRequiredMixin, View):
def get(self, request, user, *args, **kwargs):
profile = UserProfile.objects.get(user=user)
my_user = profile.user
context = {
'user': my_user,
'profile': profile,
}
return render(request, 'profile/profile.html', context)
我的用户配置文件与 django 用户模型附带的用户模型不同:
User = settings.AUTH_USER_MODEL
class UserProfile(models.Model):
user = models.OneToOneField(User, primary_key=True, verbose_name='user',
related_name='profile', on_delete=models.CASCADE)
first_name = models.CharField(max_length=30, blank=True, null=True)
last_name = models.CharField(max_length=30, blank=True, null=True)
email = models.CharField(max_length=30, blank=True, null=True)
bio = models.TextField(max_length=500, blank=True, null=True)
创建用户的信号:
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
解决方案
如何在注册时创建用户和用户配置文件?
class CustomSignupForm(SignupForm):
first_name = forms.CharField(max_length=30, label='First Name')
last_name = forms.CharField(max_length=30, label='Last Name')
bio = forms.CharField(max_length=255, label='Bio')
def save(self, request):
# create user the create profile
user = super(CustomSignupForm, self).save(request)
### now save your profile
profile = UserProfile.objects.get_or_create(user=user)
profile.first_name = self.cleaned_data['first_name']
profile.last_name = self.cleaned_data['last_name']
profile.bio = self.cleaned_data['bio']
profile.save()
return user
如何为 django-allauth 附带的表单添加样式,即在
在您的模板中创建一个新目录,将其命名为 /account/login.html 并在那里呈现您的表单并添加如下样式
这可以通过多种方式完成
- 使用https://pypi.org/project/django-bootstrap4/
- https://pypi.org/project/django-widget-tweaks/
- 手动渲染字段https://simpleisbetterthancomplex.com/article/2017/08/19/how-to-render-django-form-manually.html
我该如何修改,以便当用户登录时,它将他重定向到 /profiles/ 而不是 /accounts/profiles 或者就 REST 原则而言更好的是 /accounts/profiles/ 如果是的话,那么有可能吗修改配置文件应用程序,以便它可以使用 django-allauth 视图?
转到您的设置文件并添加以下内容
LOGIN_REDIRECT_URL = "/profiles"
你可以在这里查看更多设置 https://django-allauth.readthedocs.io/en/latest/configuration.html
推荐阅读
- reactjs - 如何减少减速器内嵌套数组中的计数值
- c# - 检查哪些控件有边框 c#
- sql - 如何在分层数据中获取所有父母的所有孩子
- c# - 如何使用 c# 从 shell:AppsFolder 虚拟文件夹中检索项目及其详细信息?
- ffmpeg - 在 concat 情况下更改 FFmpeg 输出视频的帧速率
- r - 如何从字符串中包含维度的字符串列中提取产品维度?
- javascript - 使用javascript下载多个文件
- entity-framework - 具有自身外键的 Net Core ApplicationUser
- python - 如何改变熊猫的周期
- sql - 为什么我的 T-SQL 查询在不同的窗口中返回不同?