Редактирование UserProfile с использованием форм Django - PullRequest
0 голосов
/ 25 апреля 2018

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

Модель

class UserProfileModel(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    age = models.PositiveIntegerField(blank=True, null=True)
    email = models.EmailField(max_length=254, null=True, blank=True, unique=True)
    height = models.PositiveIntegerField(blank=True, null=True)
    weight = models.PositiveIntegerField(blank=True, null=True)

форма

class UpdateProfile(forms.ModelForm):

    class Meta:
        model = UserProfileModel
        fields = ('email', 'age', 'height', 'weight')

Просмотры

def update_profile(request):
    args = {}

    if request.method == 'POST':
        form = UpdateProfile(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            # return HttpResponseRedirect(reverse('account:profile'))
            return render(request, 'account/profile.html')
    else:
        form = UpdateProfile()
        if request.user.is_authenticated():
            form = UpdateProfile(instance=request.user)
        args['form'] = form
        return render(request, 'account/edit_profile.html', args)

URL

app_name = 'account'
urlpatterns = [
    url(r'^profile/$', views.profile, name='profile'),
    url(r'^profile/edit/$', views.update_profile, name='edit_profile'),
    url(r'^home/$', views.home, name='home'),

]

HTML

{% block body %}
    <div class="container">
        <form method="POST" action=".">
            {% csrf_token %}
            {{ form.as_p }}
            <button type="submit">Submit</button>
        </form>
        <br>
    </div>
{% endblock %}

1 Ответ

0 голосов
/ 25 апреля 2018

Ваша форма предназначена не для пользователя, а для UserProfileModel (что, кстати, является нечетным именем; нет необходимости включать слово «модель»).

Таким образом, вы должны передать профиль, а не пользователя, в форму:

form = UpdateProfile(request.POST, instance=request.user.userprofilemodel)

Обратите внимание, что вы, вероятно, также хотите передать его в блок else, чтобы пользователь увиделсуществующие данные для редактирования в GET:

form = UpdateProfile(instance=request.user.userprofilemodel)

Кроме того, вы должны перенаправить после успешного POST, как вы делаете в закомментированной строке, а не визуализировать шаблон.

...