Пользовательские Django-профили создают / редактируют modelForm, не сохраняя должным образом - PullRequest
1 голос
/ 21 июля 2010

Резюме:

u = self.instance.user

in

def save(self, *args, **kwargs):
  u = self.instance.user
  u.first_name = self.cleaned_data['first_name']
  u.last_name = self.cleaned_data['last_name']
  u.save()
  return super(ProfileForm, self).save(*args, **kwargs)

вызывает проблему, поскольку self.instance не существует.Но все же, как это делается в других примерах, где это, кажется, работает.Чего мне не хватает?

Читайте дальше для получения дополнительной информации ->

Я использую как django-registration, так и django-profile.В целях просто заставить его работать, я не добавил никаких дополнительных полей в модель профиля (которая расширяет Пользователь).Пока это выглядит так:

class sumaConnectUser(models.Model):

    user = models.ForeignKey(User)

    def __unicode__(self):
        return self.user.first_name + " " + self.user.last_name

    def get_absolute_url(self):
        return ('profiles_profile_detail', (), { 'username': self.user.username })
    get_absolute_url = models.permalink(get_absolute_url)

Насколько я понимаю, мой профиль пользователя должен включать поля, которые входят в модель contrib.auth Пользователь.(имя, фамилия и т. д.)

В своем urls.py я передаю свою пользовательскую форму для создания и редактирования профилей -

(r'^profiles/edit', 'profiles.views.edit_profile', {'form_class': ProfileForm, }),
(r'^profiles/create', 'profiles.views.create_profile', {'form_class': ProfileForm, }),                   
(r'^profiles/', include('profiles.urls')),

Наконец, вот мой профильform-

from suma.sumaconnect.models import sumaConnectUser
from django import forms
from django.contrib.auth.models import User

class ProfileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
    super(ProfileForm, self).__init__(*args, **kwargs)
    try:
        self.fields['first_name'].initial = self.instance.user.first_name
        self.fields['last_name'].initial = self.instance.user.last_name
    except User.DoesNotExist:
        pass

first_name = forms.CharField(label="First Name")
last_name = forms.CharField(label="Last Name")

class Meta:
  exclude = ('user',)
  model = sumaConnectUser

def save(self, *args, **kwargs):
  u = self.instance.user
  u.first_name = self.cleaned_data['first_name']
  u.last_name = self.cleaned_data['last_name']
  u.save()
  return super(ProfileForm, self).save(*args, **kwargs)

Моя цель - позволить пользователю редактировать свое имя и фамилию в рамках редактирования профиля, но не имя пользователя и пароль.

Я думал о замене

u = self.instance.user

с

u = User.objects.get(user = self.cleaned_data['username'])

, но для этого потребуется, чтобы я добавил username = forms.CharField на страницу, которую я не хочу отображать.Насколько я понимаю, когда я захожу на страницу создания профиля или редактирования профиля, я должен автоматически редактировать профиль, связанный с пользователем, в который я вошел как.

К тому времени, когда я прихожу к этому созданиюили отредактируйте страницу пользователя, модель пользователя уже существует, но профиль не существует.Это причина проблемы?Я думаю, что я неправильно понимаю что-то важное, и я был бы очень признателен за любые указания относительно того, где я иду не так.Спасибо!

1 Ответ

0 голосов
/ 21 июля 2010

Вы можете скопировать поля, если хотите, и дважды обновить их, как описано выше, но это не является целью профиля.Он должен обрабатывать поля не в оригинальном auth.User, так как вам не нужно редактировать эту модель напрямую.Вы упомянули «расширение пользователя» выше - вы на самом деле не наследуете от auth.User, не так ли?Я настоятельно не рекомендую.

Обновление:

См. этот справочный материал .Он использует тот же синтаксис, что и вы для обновления пользователей внутри профиля.

Обновление 2:

Пример для редактировать профиль , а не создавать профиль.Глядя на код в файле profile.views.create_profile:

if request.method == 'POST':
    form = form_class(data=request.POST, files=request.FILES)
    if form.is_valid():
        profile_obj = form.save(commit=False)
        profile_obj.user = request.user
        profile_obj.save()

Таким образом, он сохраняет форму сначала , затем задает user , а затем сохраняет профиль.

Это означает, что вы не можете установить пользовательские значения в форме. Сохранение, вам нужно сделать это в модели профиля.save:

# in sumaConnectUser:

from django.db.models.base import ObjectDoesNotExist
class sumaConnectUser(models.Model):
  ...
  def save( self, *args, **kwargs ):
    s = super(sumaConnectUser,self).save( *args, **kwargs )
    try:
      u = s.user
      u.first_name = self.first_name
      u.last_name  = self.last_name
      u.save()
    except ObjectDoesNotExist:
      pass
    return s

В основном, глядя на код в профиле.views.create_profile, мы положительны , что в конечном итоге звонки сохраняются в профиле после , установленного user.Это может быть не в первый раз, поэтому нам нужно поймать это дело и забыть об этом.Потому что, в конце концов, он будет вызван и вызовет наш код сохранения для пользователя.В результате, независимо от того, какие формы у вас есть в будущем для этого профиля пользователя, он всегда будет сохраняться обратно для основного пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...