簡體   English   中英

如何將注冊期間指定的信息自動添加到“個人資料”? Django 2.1.5

[英]How automatically add info, specified during registration, to "Profile"? Django 2.1.5

我通過OneToOne ProfileUser與信號進行了匹配。 我創建SignUpForm帶有附加字段( locationemailfirstname等)和電子郵件確認的SignUpForm

如何將此信息( locationemailfirstname等)自動添加到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM