【问题标题】:my user_id profile database is null, how i insert the value in user_id?我的 user_id 配置文件数据库为空,我如何在 user_id 中插入值?
【发布时间】:2020-11-20 09:47:19
【问题描述】:

为什么我的数据看起来像这样?

我可以在 user_id 中设置值吗? 如果我删除 def create_user_profile,它将创建 nama、nik、email、nomor_hp。 但 user_id 为空

在图片中,我在没有 def create_user_profile 的情况下创建了 id 1 和 2 id 3,4,5,6 是在我使用用户 def create_user_profile 时创建的

这是我的models.py

class Profile(models.Model):
    user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
    nama = models.CharField(max_length=30, blank=True)
    nik = models.CharField(max_length=30, blank=True)
    email = models.EmailField(max_length=75, blank=True)
    nomor_hp = models.TextField(max_length=15, blank=True)

    def __str__(self):
        return self.user

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    try:
        instance.profile.save()
    except ObjectDoesNotExist:
        Profile.objects.create(user=instance)

这是我创建用户的views.py,我这里是不是搞错了?

def signup(request):
    if request.method == 'POST':
        user_form = UserCreationForm(request.POST)
        profile_form = ProfileForm(request.POST)
        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save(commit=False)
            profile = profile_form.save(commit=False)
            user.is_active = False
            user.save()
            profile.save()
            uidb64 = urlsafe_base64_encode(force_bytes(user.pk))
            domain = get_current_site(request).domain
            link=reverse('activate', kwargs={
                        'uidb64': uidb64, 'token': token_generator.make_token(user)})
            activate_url = 'http://'+domain+link
            email_body = 'Hallo '+user.username + 'Tolong gunakan link ini untuk verifikasi akun anda\n' +activate_url
            email_subject = 'Aktivasi Akun Anda'
            email = EmailMessage(
                email_subject,
                email_body,
                'noreply@kantorkecamatanbintanutara.com',
                [profile.email],
            )
            email.send(fail_silently=False)
            return redirect('/pengurusan/signin')
        else:
            return render(request, 'pengurusan/register.html', {
            'user_form': user_form,
            'profile_form': profile_form
            })

【问题讨论】:

  • 看起来您正在触发器中以外的其他位置创建其他 Profile 对象,并且这些视图/信号/... 创建了一个没有 UserProfile
  • 如果我删除信号,值 user_id 根本不会出现
  • 如何解决这个问题? @WillemVanOnsem
  • 但信号可能不对缺少user_id 的记录负责。可能是某些其他视图/信号创建了这些记录。
  • 我已经在里面添加了我的观点,我在那里做错了吗? @WillemVanOnsem

标签: python django django-models django-mysql


【解决方案1】:

您的signup 视图和信号都创建了一个Profile 对象,更糟糕的是,在后者中您没有链接到用户。

我建议放弃创建Profile 的信号。它没有多大用处。如果您稍后编辑Profile,您应该简单地保护它,此外您应该确保在创建User 对象时,您只需正确链接它。例如:

def signup(request):
    if request.method == 'POST':
        user_form = UserCreationForm(request.POST)
        profile_form = ProfileForm(request.POST)
        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save()
            profile_form.instance.user = user
            profile = profile_form.save()
            # …
    # …

【讨论】:

  • 感谢您的解释、建议和帮助,它的作品
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2018-08-11
相关资源
最近更新 更多