[英]How automatically add info, specified during registration, to "Profile"? Django 2.1.5
我通過OneToOne
Profile
與User
與信號進行了匹配。 我創建SignUpForm
帶有附加字段( location
、 email
、 firstname
等)和電子郵件確認的SignUpForm
。
如何將此信息( location
、 email
、 firstname
等)自動添加到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實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.