2016-05-26 4 views
0

Я очень рано нахожусь в своем путешествии по развитию Django/Python, большинство вещей, которые я смог быстро выяснить после нескольких часов/дней царапин на голове и проб/ошибок. У меня теперь есть часто задаваемый вопрос, что я не могу нормально работать:Форма и вид обновления пользователя Django

Как создать просмотр/форму обновления профиля пользователя?

Я взломал несколько решений от Stack Overflow и просто не могу понять, что я делаю неправильно до сих пор. Вот первоначальный вариант моей бедной попытки с помощью Django 1.9:

#forms.py 
class profileForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ['first_name', 'last_name', 'email'] 

#views.py 
@login_required 
def profile(request): 
    if request.method == 'POST': 
     form = profileForm(data=request.POST, instance=request.user) 
     update = form.save(commit=False) 
     update.user = request.user 
     update.save() 
    else: 
     form = profileForm(instance=request.user) 

    return render(request, 'profile.html', {'form': form}) 

#urls.py 
urlpatterns = [ 
    url(r'^dashboard/$', views.dashboard, name='dashboard'), 
    url(r'^dashboard/profile$', views.profile, name='profile'), 
] 

#profile.html 
<form action="." method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit">Update Profile</button> 
</form> 

Так что текущее поведение моего обновления профильного пользователя не обновлять какие-либо из указанных полей в форме на POST, но страница не содержит груз на другой URL. Например, URL-адрес формы для обновления профиля: /dashboard/profile, который перенаправляет на /приборную панель на отправку формы. Если я вручную добавлю email/first_name/last_name в администраторе Django, он будет корректно отображаться в моей форме ... Я просто не могу заставить его сохранять обновленные данные.

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

Я заранее извиняюсь за глупый вопрос, у меня есть Googled around и попытки других решений, но я либо не могу получить одинаковые исходные ошибки, либо не может получить рабочую версию как подробно.

Спасибо всем и отлично провели день и ночь!

EDIT:

Я также попытался это решение How to update User object without creating new one?, который также имеет такое же поведение: не обновлять какие-либо из указанных полей в форме на POST, но страница не содержит нагрузку на другой URL. .. что меня смущает больше, может быть, проблема связана с моим urls.py?

ответ

2

Здесь нет ничего конкретного. У вас две проблемы: первая из-за ваших URL. Ваш профиль не заканчивается косой чертой, поэтому действие формы «.» отправляет его родительскому элементу «/ dashboard», и он вообще не обрабатывает код обработки.

url(r'/dashboard/profile/$'...) 

Во-вторых, модель не будет обновлена, потому что вы не назвали метод валидации формы.

if request.method == 'POST': 
    form = profileForm(data=request.POST, instance=request.user) 
    if form.is_valid(): 
     form.save() 
     return redirect('somewhere') 

Примечание: здесь нет причин использовать commit = False; экземпляр уже является пользователем.

+0

Спасибо за объяснение Даниэль, высоко оценил - urls.py должно было быть первое место, которое я проверил со странным поведением подчинения. Ваш пример кажется отсутствующим двоеточием 'if form.is_valid():' Еще раз спасибо. – tract

+0

Хорошее место, исправлено. –

Смежные вопросы