django:使用一对一扩展用户模型:如何保存()配置文件模型的字段

时间:2018-12-11 05:25:08

标签: django django-models django-users django-signals

我有一个基本的Django应用程序,其中与用户模型一起使用一对一字段扩展了Profile模型。

Models.py

class Profile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE,  null=True)
  profile_picture = models.ImageField(upload_to='customer_profile_images/%Y/%m/%d/', null=True, blank=True, verbose_name="Profile Picture")
  phone_number = models.CharField(null=True, blank=True, max_length=10)

  # no need for following two methods
  # def create_user_profile(sender, instance, created, **kwargs):
    # if created:
        # Profile.objects.get_or_create(user=instance)

  # post_save.connect(create_user_profile, sender=User)

  def __str__(self):
     return f'{self.user.first_name} {self.user.last_name}'

我已在 admin.py 中注册了个人档案模型,如下所示:

from myapp import Profile


class ProfileAdmin(admin.ModelAdmin):
list_display = ('user', 'phone_number')

admin.site.register(Profile, ProfileAdmin)

并且在用户模型内成功创建了个人档案模型。

并且在 views.py

中为用户创建新帐户时
class CustomerSignUpView(View):
def post(self, request):
    name_r = request.POST.get('customer_username')
    password_r = request.POST.get('customer_password')
    email_r = request.POST.get('customer_email')
    contact_number_r = request.POST.get('customer_contact_number')
    profile_picture_r = request.FILES['customer_profile_picture']

     # this is how i am saving contact number, profile picture for Profile model.

    if checkemail(email_r):
        c = User.objects.create_user(username=name_r, password=password_r, email=email_r)
        c.save()

        # add the following code
        p = Profile(user=c, phone_number=contact_number_r, profile_picture=profile_picture_r)
        p.save()       

        return render(request, 'catalog/customer_login.html')
    else:
        return render(request, 'catalog/customer_signup.html')

def get(self, request):
    return render(request, 'catalog/customer_signup.html')

但是,在注册页面中创建新用户帐户时,遇到以下错误:

error

我不知道如何使用save()方法保存这些新创建的Profile模型字段。

请提供解决方案!谢谢

更新:找到解决方案-

在views.py中,这就是我在Profile模型中保存字段的方式

     p = Profile(user=c, phone_number=contact_number_r, profile_picture=profile_picture_r)
     p.save()

现在,每当我注册新用户时,用户名,个人资料图片和电话号码也会添加到个人资料模型中,甚至在删除/更新个人资料详细信息时,更改也会同时反映在用户和个人资料模型

以下链接对于我的项目要求很有用:

http://books.agiliq.com/projects/django-orm-cookbook/en/latest/one_to_one.html

1 个答案:

答案 0 :(得分:0)

首先,保存用户后无需保存配置文件实例:

 @receiver(post_save, sender=User)
  def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

删除上述代码。要回答您的问题,如果未创建User实例,则您不想创建配置文件实例,因此无需为此担心。请在您的 admin.py 中添加以下代码,以将admin用户表单与配置文件1合并。

class ProfileInline(admin.StackedInline):    
    model = Profile
    can_delete = False
    verbose_name_plural = 'Profile'
    fk_name = 'user'

此外,建议您阅读this

您不应直接从帖子中获取值。这不是安全的方法。使用基本格式并从cleaned_data字典中获取数据,或使用ModelForm。

我假设您是Django的新手,如果您不太着迷于使用基于类的视图,建议您使用基于函数的视图。您会很容易的,因为您将看到所有步骤。

跟随this一个。如果没有,this将解决您的问题,因此您可以将代码调整为该代码。