2016-03-26 2 views
0

Я пробовал UserProfile с использованием OneToOneField для расширения User в Django, который, кажется, работает. Затем я создал регистрационное представление и формы, чтобы иметь возможность регистрировать новый User с использованием модуля UserProfile.Django Admin - объект «UserProfile» не имеет атрибута «first_name»

Проблема заключается в том, что, когда я создал User, используя эту форму, Django администратора начал вызывать ошибки при нажатии на кнопку Users в Admin странице.

EDIT: Возможно, стоит сказать, что когда я создал нового пользователя, было некоторое исключение, что ID не является уникальным, что, вероятно, вызвано методом post_save в моделях.

Знаете ли вы, где проблема или что делать?

enter image description here Вот куски моего кода:

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) 

ответ

3

__unicode__ метод, в вашем UserProfile модель, она использует self.first_name и self.sur_name, которые на самом деле не существует в этой модели.

self.user.first_name будет уместным.

0

Проблема заключается в коде ..

Защиту юникода (Я): возвращение '{} {}' формат (self.first_name, self.surname)

здесь вы звоните. self.first_name,self.surname, которые в не определяют в UserProfile

определяют first_name и surname

как

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

в вашем UserProfile классе