Как вы обновляете атрибут в профиле пользователя в Django с помощью команды? - PullRequest
1 голос
/ 16 февраля 2011

В Django стандартным способом добавления дополнительной информации, которая будет связана с пользователем, является использование профиля пользователя. Для этого у меня есть приложение под названием «Счета»

accounts
   __init__.py 
   models.py 
       admin.py  (we'll ignore this for now, it works fine) <br>
       management 
            __init__.py 
            commands 
                 __init__.py 
                 generate_user.py 

в settings.py у нас есть AUTH_PROFILE_MODULE = 'account.UserProfile'

в models.py у нас есть

from django.db import models 
from django.contrib.auth.models import User
# Create your models here.    
class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    age=models.IntegerField()
    extra_info=models.CharField(max_length=100,blank=True)
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])    

В последней строке используются декораторы python для получения объекта профиля пользователя, если он уже существует, или для возврата существующего. Этот код взят из: http://www.turnkeylinux.org/blog/django-profile#comment-7262

Далее нам нужно попытаться сделать нашу простую команду. Так в gen_user.py

from django.core.manaement.base import NoArgsCommand
from django.db import models
from django.contrib.auth.models import User
from accounts.models import UserProfile
import django.db.utils


class Command(NoArgsCommand):
help='generate test user'
def handle_noargs(self, **options):
    first_name='bob'; last_name='smith'
    username='bob' ; email='bob@bob.com'
    password='apple'
    #create or find a user
    try:
        user=User.objects.create_user(username=username,email=email,password=password)
    except django.db.utils.IntegrityError:
        print 'user exists'
        user=User.objects.get(username=username)
    user.firstname=first_name
    user.lastname=last_name
    user.save() #make sure we have the user before we fiddle around with his name
    #up to here, things work.
    user.profile.age=34
    user.save()
    #test_user=User.objects.get(username=username)
    #print 'test', test_user.profile.age
    #test_user.profile.age=23
    #test_user.save()
    #test_user2=User.objects.get(username=username)
    #print 'test2', test_user2.profile.age

для запуска из каталога вашего проекта введите python manage.py gen_user

Вопрос в том, почему возраст не обновляется? Я подозреваю, что это тот случай, когда я поймал ставка вместо реального объекта, ставка все, что я пробовал от использования user.userprofile_set.create до использования setattr и т. д., провалилось, и у меня заканчиваются идеи. Есть ли лучший шаблон? В идеале, я хотел бы просто иметь возможность подать запрос на обновление пользовательского профиля, но сейчас я не вижу, как даже обновить один параметр. Кроме того, даже когда мне удалось создать пользователя с одним параметром (возраст, который требуется), я не смог позднее обновить дополнительный параметр. Я не могу удалить или удалить старый профайл пользователя и добавить новый из-за связи с иностранными ключами.

Идеи? Спасибо !!!!

1 Ответ

3 голосов
/ 16 февраля 2011

user.profile возвращает профиль, но нигде вы не пытаетесь на самом деле сохранить его. Поместите результат в переменную, измените его и сохраните.

profile = user.profile
profile.age = 34
profile.save()
...