[英]Django Signals not creating profile after user registration
我希望在用戶注冊完成后創建配置文件,但我必須為現有用戶單獨創建一個配置文件。
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from main.models import Membership
# Create your models here.
class Profile(models.Model):
membership = models.OneToOneField(
Membership, on_delete=models.CASCADE, related_name="membership", default="null")
user = models.OneToOneField(
User, on_delete=models.CASCADE, related_name="profile")
couple_with = models.OneToOneField(
User, on_delete=models.CASCADE, related_name="couple_with", blank=True, null=True)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
maiden_name = models.CharField(max_length=2, blank="")
street_address = models.CharField(max_length=50)
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, default="Select")
date_of_birth = models.DateField( blank=True, null=True)
address2 = models.CharField(max_length=10)
city = models.CharField(max_length=20)
state = models.CharField(max_length=20)
zip = models.CharField(max_length=5)
country_name = models.CharField(max_length=30)
graduate_year = models.CharField(max_length=4)
def __str__(self):
return(self.first_name + " " + self.last_name)
@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
user = instance
print(user)
if created:
profile = Profile.objects.create(user=user)
profile.save()
這就是我的 views.py 的樣子。 我不知道我在哪里滑倒。 它能夠在注冊后創建用戶,但永遠不會創建配置文件,管理員必須手動創建配置文件。
def register_account(request):
# check if the user is already logged in
if request.user.is_authenticated:
return redirect("main:home")
# if not logged in
else:
if request.method == 'POST':
form = RegistrationForm(request.POST or None)
# check if the form is valid
if form.is_valid():
user = form.save(commit=False)
duplicate = False
nonWarhawks = False
# for u in users:
# if user.email == u.email:
# error_message = "Email Already Exists"
# duplicate = True
# break
if User.objects.filter(email=user.email).exists():
duplicate = True
# duplicate check
if duplicate:
return render(request, 'accounts/register.html', {"error_message": "Email Already Exists", "form": form})
user.is_active = False
user.save()
# create profile
user.refresh_from_db()
user.profile.copule_with = None
user.profile.first_name = request.POST.get("first_name")
user.profile.last_name = request.POST.get("last_name")
user.profile.maiden_name = request.POST.get("maiden_name")
user.profile.street_address = request.POST.get("street_address")
user.profile.city = request.POST.get("city")
user.profile.zip = request.POST.get("zipcode")
user.profile.country_name = request.POST.get("country_name")
user.profile.graduate_year = request.POST.get("graduate_year")
print(user.profile.first_name)
user.profile.save()
current_site = get_current_site(request)
mail_subject = 'Activate your account.'
message = render_to_string('accounts/acc_active_email.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
'protocol': 'http'
})
to_email = form.cleaned_data.get('email')
email = EmailMessage(
mail_subject, message, to=[to_email]
)
email.send()
print("Successfully sent email using the sendgrid api")
return HttpResponse('Please confirm your email address to complete the registration')
# return redirect("daily:home")
else:
form = RegistrationForm(request.POST or None)
return render(request, 'accounts/register.html', {'form': form})
在您的個人資料 class 之外試試這個。
def create_profile(sender, **kwargs):
if kwargs['created']:
user_profile = Profile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)
您已將 @receiver 信號包含在您的配置文件 class 中。基於信號的方法實際上並不是它涉及的 class 的一部分。 刪除縮進,使其與您的 class 配置文件聲明處於同一級別
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.