迈出django's (1.5)
身份验证功能的第一步,到目前为止只是尝试将用户的电子邮件地址(用户模型中的用户名字段)拉为ForeignKey
个人资料模型Specialist
。
两个问题:
注意,在这么做之前,我点击了几个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
答案 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
,然后一切都完美无缺。