2015-11-21 2 views
0

В моем models.py я простирающаяся модель пользователя, благодаря OneToOneField:Почему некоторые поля не сохраняются в модели OneToOneField?

class MyUser(User): 
    user = models.OneToOneField(User, primary_key=True) 
    # Extra fields: 
    favourite_colour = models.CharField(max_length=100, blank=False, null=False) 

    def __str__(self): 
     return self.user.username 

Тогда в views.py, я пытаюсь спасти от формы:

def register(request): 
    if request.POST: 
     form = UserForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      favourite_colour = form.cleaned_data['favourite_colour'] 
      new_user = User.objects.create_user(username=username, password=password) 
      new_user.save() 
      new_myuser = MyUser(user=new_user) 
      new_myuser.favourite_colour = favourite_colour 
      # IF I COMMENT OUT THE LINE BELOW, the fields of User are correctly saved 
      new_myuser.save() 

      # TESTING WHETHER IT'S SAVED : 
      print("{} was saved in User, with username = {}".format(new_user, new_user.username)) 

      return HttpResponseRedirect(reverse('home')) 
     else: 
      # display the page with the errors 
      return render(request, 'registration/registration_form.html', {'form': form}) 
    else: 
     # display the blank form: 
     form = UserForm() 
     return render(request, 'registration/registration_form.html', {'form': form}) 

Если я тестирую его, например, в простой форме, я получаю: person1 was saved in User, with username = person1.

Но если я проверю в моей базе данных (db.sqlite3) объект создан не имеет имя пользователя или пароль, только id, is_superuser, is_staff, is_active, date_joined определены.

Это как если бы мои поля password и username были удалены после.

Как было отмечено в комментарии внутри кода, если я закомментировать MyUser.save() (модель MyUser которая связана с User по OneToOneField), поля внутри User правильно заполнены (но связанная модель MyUser остается пустым, очевидно)

+0

Вы должны также проверить, если 'form.cleaned_data [ 'имя пользователя']' и ' form.cleaned_data ['password'] 'есть, а затем проверить сразу после' new_user.save() ', чтобы убедиться, что' 'new_user' правильно установил' username' 'password'. –

ответ

2

Вы путаете здесь два понятия: наследование и отношения. Вы объявили MyUser как наследующий от пользователя; это означает, что он автоматически получает все поля от пользователя. Но у вас есть также определяет отношение к классу User; экземпляр пользователя в этом отношении не совпадает с экземпляром, который вы наследуете.

Вы не должны этого делать. Если вы хотите создать отношения, сделайте это: удалите наследование, создав экземпляры отдельно по мере того, как ваш код уже делает, и все работает нормально.

+0

Это было так глупо! Большое спасибо за указание моей глупой ошибки ... – ThePhi

0

@ Daniel Roseman является правильным. Если вы хотите расширить свою модель пользователя, вы должны создать модель UserProfile, которая имеет отношения «один к одному». Вот общая картина:

models.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User, relate_name='userprofile') 
    favourite_colour = models.CharField(max_length=100, blank=False, null=False) 

    def __str__(self): 
     return self.user.username 

def get_or_create_profile(user): 
    profile, created = UserProfile.objects.get_or_create(user=user) 
    return profile 

User.userprofile = property(get_or_create_profile) 

views.py

def register(request): 
    if request.POST: 
     form = UserForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      favourite_colour = form.cleaned_data['favourite_colour'] 
      user = User.objects.create_user(username=username, password=password) 

      userprofile, created = UserProfile.objects.get_or_create(user=user) 
      if created: 
       userprofile.favourite_colour = favourite_colour 
       userprofile.save() 
      else: 
       print '... User/UserProfile already exists! Handle that here...' 

      return HttpResponseRedirect(reverse('home')) 
     else: 
      # display the page with the errors 
      return render(request, 'registration/registration_form.html', {'form': form}) 
    else: 
     # display the blank form: 
     form = UserForm() 
     return render(request, 'registration/registration_form.html', {'form': form}) 
Смежные вопросы