【问题标题】:Django Admin - 'UserProfile' object has no attribute 'first_name'Django Admin - 'UserProfile' 对象没有属性 'first_name'
【发布时间】:2016-03-26 12:08:04
【问题描述】:

我尝试在 Django 中使用 OneToOneField 扩展 UserUserProfile,这似乎可行。然后,我创建了一个注册视图和表单,以便能够使用UserProfile 模块注册新的User

问题是,当我使用此表单创建User 时,当我单击Admin 页面中的Users 按钮时,Django Admin 开始引发错误。

编辑:可能值得一提的是,当我创建一个新用户时,有一些异常 ID 不是唯一的,这可能是由模型中的 post_save 方法引起的。

你知道问题出在哪里或者我应该怎么做吗?

这是我的代码片段:

VIEWS.PY

def register(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST)
        profile_form = UserProfileForm(request.POST)
        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save()
            user.set_password(user.password)
            user.save()

            profile = profile_form.save(commit=False)
            profile.user = user
            profile.save()
            return register_success(request)
        else:
            print user_form.errors, profile_form.errors

    else:
        user_form = UserForm()
        profile_form = UserProfileForm()

    return render(request,"auth/registration/register.html",context={'user_form':user_form,'profile_form':profile_form}) 

FORMS.PY

class ContactUsForm(forms.Form):
    contact_name = forms.CharField(required=True)
    from_email = forms.EmailField(required=True)
    subject = forms.CharField(required=True)
    message = forms.CharField(
            required=True,
            widget=forms.Textarea
    )


class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta:
        model = User
        fields = ('username', 'email', 'password')

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('telephone',)

MODELS.PY

class UserProfile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)

    # ATRIBUTY KTORE BUDE MAT KAZDY
    telephone = models.CharField(max_length=40)

    HOW_DO_YOU_KNOW_ABOUT_US_CHOICES = (
            ('coincidence',u'It was coincidence'),
            ('relative_or_friends','From my relatives or friends'),
            )
    how_do_you_know_about_us = models.CharField(max_length=40, choices=HOW_DO_YOU_KNOW_ABOUT_US_CHOICES, null=True)

    MARITAL_STATUS_CHOICES = (
        ('single','Single'),
        ('married','Married'),
        ('separated','Separated'),
        ('divorced','Divorced'),
        ('widowed','Widowed'),
    )
    marital_status = models.CharField(max_length=40, choices=MARITAL_STATUS_CHOICES, null=True)

    # OD KIAL STE SA O NAS DOZVEDELI
    # A STAV

    def __unicode__(self):
        return '{} {}'.format(self.first_name,self.surname)

def create_profile_user_callback(sender,instance, **kwargs):
    profile, new = UserProfile.objects.get_or_create(user=instance)
post_save.connect(create_profile_user_callback, User)

ADMIN.PY

admin.site.register(AdminContact)

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'User_Profile'

class UserAdmin(BaseUserAdmin):
    inlines = (UserProfileInline, )

admin.site.unregister(User)
admin.site.register(User,UserAdmin)

【问题讨论】:

    标签: python django django-models django-forms django-admin


    【解决方案1】:

    __unicode__ 方法,在您的 UserProfile 模型中,它使用了 self.first_nameself.sur_name,实际上在此模型中不存在。

    self.user.first_name 比较合适。

    【讨论】:

      【解决方案2】:

      问题出在你的代码中..

      def unicode(自我): return '{} {}'.format(self.first_name,self.surname)

      你在这里调用self.first_name,self.surname,这在UserProfile中没有定义

      定义first_namesurname

      喜欢

      first_name= models.CharField(max_length=255)
      surname= models.CharField(max_length=255)
      

      在你的 UserProfile 班级中

      【讨论】:

        猜你喜欢
        • 2020-05-10
        • 2016-10-21
        • 2016-07-14
        • 2019-04-02
        • 2020-02-15
        • 2018-03-16
        • 1970-01-01
        • 2016-10-23
        • 2011-01-16
        相关资源
        最近更新 更多