在配置文件模型和用户模型之间保存外键

时间:2014-01-24 02:28:26

标签: django foreign-keys models user-profile

迈出django's (1.5)身份验证功能的第一步,到目前为止只是尝试将用户的电子邮件地址(用户模型中的用户名字段)拉为ForeignKey个人资料模型Specialist

两个问题:

  1. 这是对外交流的最佳实践方式吗? 配置文件模型中的用户详细信息请注意,我不是想保存一个 新用户,只需将他们的个人资料详细信息关联回来 经过身份验证的用户对象(CustomUser)。到用户到达时 在下面的视图中,它们已经过身份验证。
  2. 以下内容需要进行哪些更改才能使其正常工作 应该?
  3. 注意,在这么做之前,我点击了几个user_id 不能为空必须是在一个CustomUser对象错误的实例中,我现在我被重定向到/profile/后,数据库中没有看到任何内容。

    # view
    
    @login_required
    def profile_setup_specialist(request):
        if request.method == 'POST':
            current_user = CustomUser.objects.get(email = request.user.email)
            posted_form = SpecialistCreationForm(request.POST, instance=current_user)
            if posted_form.is_valid():
                profile = posted_form.save(commit=False)
                profile.user = current_user
                profile.save()
                return HttpResponseRedirect('/profile/')
    
                # ..
    
    
    # profile model
    
    class Specialist(models.Model):
    
        user = models.ForeignKey(CustomUser, related_name='Specialist')
        foo = models.CharField(max_length=100)
        # ...
    
        def __unicode__(self):
            return self.foo
    
     # form
    
    class SpecialistCreationForm(forms.ModelForm):
    
        class Meta:
            model = Specialist
            exclude = ['user']
    
    
    # custom user model
    
    class CustomUser(AbstractBaseUser, PermissionsMixin):
    
        email           = models.EmailField(
                            verbose_name='email address',
                            max_length=255,
                            unique=True,
                            db_index=True,
                            )
    
        # ..
    
        objects = CustomUserManager()
    
        USERNAME_FIELD  = 'email'
        REQUIRED_FIELDS = ['first_name', 'last_name', 'state']
    
        def __unicode__(self):
            return self.email
    

2 个答案:

答案 0 :(得分:0)

我知道编写自定义用户模型并不好玩,这涉及编写/扩展许多自定义表单,例如question。如果我坚持使用普通用户模型,我会说专家模型与用户建立OneToOne关系,

类专家(models.Model):

user = models.OneToOneField(User)

因此您可以像request.user.specialist

一样查询个人资料

答案 1 :(得分:0)

通过在SQLite数据库中挖掘,找到了这些问题的解决方案,如建议here

manage.py sqlall命令显示如下,其中Django自动创建的模型隐藏id字段被指定为PRIMARY KEY

BEGIN;
CREATE TABLE "profiles_specialist" (
    "id" integer NOT NULL PRIMARY KEY,
    "user_id" integer NOT NULL REFERENCES "auth2_customuser" ("id"),

隐藏的id字段以某种方式丢失了PK状态,并且仅设置为INTEGER,每次保存新对象时都无法自动递增。

此字段需要重置为INTEGER PRIMARY KEY,然后一切都完美无缺。