我正在使用django-allauth来处理账户、登录、注销和注册,但是我希望在创建用户时必须创建一个profile,我使用了模型UserProfile,如代码所示。问题是当我创建自定义的注册表单后,现在它只会创建一个具有[用户名、电子邮件、名字、姓氏、密码]的用户,但不会创建UserProfile。我的三个问题如下:
- 如何在注册时创建User和UserProfile?
- 如何为django-allauth提供的表单添加样式,例如/accounts/login/?
- 如何修改用户登录后重定向到/profiles/,而不是/accounts/profiles/,或是从REST原则来看,是否更好将其设置为/accounts/profiles/?如果是,那么是否可以修改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',
}
主要的URL模式:
# django_project/django_project/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('profiles/', include('profiles.urls')),
path('accounts/', include('allauth.urls')),
]
个人资料应用中的URL模式:
# 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()