В 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 и т. д., провалилось, и у меня заканчиваются идеи. Есть ли лучший шаблон? В идеале, я хотел бы просто иметь возможность подать запрос на обновление пользовательского профиля, но сейчас я не вижу, как даже обновить один параметр. Кроме того, даже когда мне удалось создать пользователя с одним параметром (возраст, который требуется), я не смог позднее обновить дополнительный параметр. Я не могу удалить или удалить старый профайл пользователя и добавить новый из-за связи с иностранными ключами.
Идеи? Спасибо !!!!