Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Редактирование профиля пользователя + User [RSS Feed]

#1 Март 18, 2013 20:57:28

ssv1
Зарегистрирован: 2012-12-22
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Редактирование профиля пользователя + User

Приветствую коллеги,

Работаю с django не более двух недель, а уже приходится учавствовать в проектах. Так вот, решил поделиться проблеммой, так как у самого что-то пока не выходит.

Глобально задача звучит просто - дать пользователю возможность редактирвоать свой профиль.

При регистрации пользователь водит лишь логин, почту и пароль, но позже при переходе в профиль у него есть возможность внести в профиль дополнительную информацию.

#models.py
class Profile(models.Model):
    user = models.OneToOneField(User)
    ava = models.ImageField(upload_to='user_image',)
    city = models.CharField(max_length=32, blank=True, null=True)
    about = models.TextField(blank=True, null=True)
    rating = models.IntegerField(default=0)
    class Meta:
        verbose_name = 'Профиль'

#forms.py
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username',  'email', 'password']
class ProfileForm(UserForm):
    class Meta(object):
        model = Profile
        fields = ('ava', 'city', 'about')
        widgets = {
            'about': forms.Textarea(attrs={'cols': 80, 'rows': 20}),
        }

#view.py
def EditProfile(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/')
    if request.method == 'POST':
        user = request.user
        usrform = UserForm(request.POST, instance=User.objects.get(username=request.user))
        proform = ProfileForm(request.POST, instance=user)
        if usrform.is_valid() and proform.is_valid():
            usrform.save()
            proform.save()
    else:
        usrform = UserForm()
        proform = ProfileForm()
    profile = request.user.get_profile
    context = { 'profile' : profile, 'usrform' : usrform, 'proform' : proform }
    return render_to_response('profile/profile_edit.html', context, context_instance=RequestContext(request))

Делаю согласно документации, что-то додумываю, что-то подсматриваю, просидел целый день а понять так и не смог. Подскажите пожалуйста, в какую сторону мне копать или где можно посмотреть примеры.

Спасибо.

Офлайн

#2 Март 18, 2013 22:29:44

romankrv
От:
Зарегистрирован: 2008-05-23
Сообщения: 513
Репутация: +  0  -
Профиль   Отправить e-mail  

Редактирование профиля пользователя + User

Офлайн

#3 Март 19, 2013 00:21:10

ssv1
Зарегистрирован: 2012-12-22
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Редактирование профиля пользователя + User

Спасибо, я очень здорово продвинулся и всё переделал согласно примерам из djangoproject, но пока не выходит..

На текущий момент уменя появляется ошибка:

Exception Value:
Reverse for 'user_profile' with arguments '(u'admin',)' and keyword arguments '{}' not found.

Но я надеюсь завтра с ней совладаю.

Офлайн

#4 Март 20, 2013 01:24:43

ssv1
Зарегистрирован: 2012-12-22
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Редактирование профиля пользователя + User

Коллеги, таки разобрался
Если вдруг кому-то интересна моя рабочая конфигурация, прошу:

#models.py
class Profile(models.Model):
    user = models.OneToOneField(User)
    ava = models.ImageField(upload_to='user_image',)
    city = models.CharField(max_length=32, blank=True, null=True)
    about = models.TextField(blank=True, null=True)
    rating = models.IntegerField(default=0)
    class Meta:
        verbose_name = 'Профиль'

# forms.py
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name']
class ProfileForm(forms.ModelForm):
    class Meta():
        model = Profile
        fields = ['ava', 'city', 'about', 'rating']

# views.py
@login_required
def EditProfile(request):
    user = request.user
    if request.method == "POST":
        usrform = UserForm(data=request.POST, instance=user)
        proform = ProfileForm(data=request.POST, instance=user.get_profile())
        if usrform.is_valid() and proform.is_valid():
            user = usrform.save()
            profile = proform.save(commit=False)
            profile.user = user
            profile.save()
            return HttpResponseRedirect('/profile/view')
        else:
            return render_to_response('profile/profile_edit.html', {
                'profile': request.user.get_profile,
                'usrform': usrform,
                'proform': proform},
                context_instance=RequestContext(request))
    else:
        usrform = UserForm(instance=user)
        proform = ProfileForm(instance=user.get_profile() )
        profile = request.user.get_profile
        return render(request, "profile/profile_edit.html", {
            'profile': profile,
            'usrform': usrform,
            'proform': proform,
            })

Пока не уверен на сто процентов, что это самый оптимальный вариант, но он отлично рабоатет.

Офлайн

  • Начало
  • » Django
  • » Редактирование профиля пользователя + User[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version