我匹配Profile
与User
通过OneToOne
信号的方式。我创建SignUpForm
额外的字段(location
,email
,firstname
等)和电子邮件确认。
如何使这种信息(location
,email
,firstname
等)automacally加入Profile
?
我想,这真的让
user.refresh_from_db()
user.profile.<...>=form.cleaned_data.get('<...>')
但我不知道怎么做。
模型.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=30, blank=True, default='', null=True)
location = models.CharField(max_length=30, blank=True, default='')
email = models.EmailField(max_length=30, blank=True, default='', null=True)
class Meta:
ordering = ["location"]
def get_absolute_url(self):
return reverse('profile-detail', args=[str(self.id)])
def __str__(self):
return self.user.username
表格.py
class SignupForm(UserCreationForm):
email = forms.EmailField()
location = forms.CharField()
class Meta:
model = User
fields = ('username', 'email', 'location', 'password1', 'password2')
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
exclude = ('user', )
信号.py
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
管理文件
class ProfileAdmin(admin.ModelAdmin):
list_display = ('user', 'location', 'email', 'first_name')
视图.py
def signup(request):
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
current_site = get_current_site(request)
mail_subject = 'Activate your blog account.'
message = render_to_string('acc_active_email.html', {
'user': user,
'domain': current_site.domain,
'uid':urlsafe_base64_encode(force_bytes(user.pk)).decode(),
'token':account_activation_token.make_token(user),
})
to_email = form.cleaned_data.get('email')
email = EmailMessage(
mail_subject, message, to=[to_email]
)
email.send()
return HttpResponse('Please confirm your email address to complete the registration')
else:
form = SignupForm()
return render(request, 'signup.html', {'form': form})
def activate(request, uidb64, token):
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except(TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.save()
login(request, user)
# return redirect('home')
return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
else:
return HttpResponse('Activation link is invalid!')
模板profile_detail.html
...
<h1>User: {{ profile.user }}</h1>
<p>{{ profile.first_name|safe }}</p>
<p>{{ profile.email|safe }}</p>
<p>{{ profile.location|safe }}</p>
...
我认为您可以将附加数据放入view
方法中。你可以这样试试:
# form
class SignupForm(UserCreationForm):
location = forms.CharField()
class Meta:
model = User
fields = ('username', 'email', 'location', 'password1', 'password2')
# view
def signup(request):
...
location = form.cleaned_data.get('location')
user = form.save(commit=False)
user.is_active = False
user.save()
profile = user.profile
profile.location = location
profile.save()
...
在这里,我没有在表单或配置文件中添加电子邮件和名字,因为如果您使用的是默认auth.User
模型,那么这些数据已经在模型中可用。为此,请参见AbstractBaseUser实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句