简体   繁体   中英

Django Admin - 'UserProfile' object has no attribute 'first_name'

I've tried a UserProfile using OneToOneField to extend User in Django which seems to work. Then, I've created a registration view and forms to be able to register new User using UserProfile module.

The problem is that when I've created a User using this form, Django Admin started to raise errors when I click on Users button in Admin page.

EDIT: Probably is worth to say that when I've created a new User, there were some exception that ID is not unique which is probably caused by post_save method in models.

Do you know where is the problem or what should I do?

在此处输入图片说明 Here are pieces of my code:

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)

__unicode__ method, in your UserProfile model, it uses self.first_name and self.sur_name , which actually do not exist in this model.

self.user.first_name would be appropriate.

The problem is in your code..

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

here you call self.first_name,self.surname which in not define in UserProfile

define first_name and surname

like

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

in your UserProfile class

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM