【问题标题】:Django - UPDATE user fields in two different views (forms)Django - 在两个不同的视图(表单)中更新用户字段
【发布时间】:2018-09-29 00:52:56
【问题描述】:

我很难处理这么简单的事情(我猜)。

我的目标是创建两个具有两种不同形式但与相同用户模型相关联的子页面

/account/register.html - 仅用于管理注册的页面(使用登录名、电子邮件、密码创建用户) /account/questionnaire.html - 用于更新相同用户信息(例如年龄、体重、身高等)的页面。

我已经在服务器日志中进行了“POST”通信,但是当我检查 django 管理站点时没有显示任何内容。

models.py

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    age = models.PositiveIntegerField(blank=False)
    weight = models.PositiveIntegerField(blank=False)
    height = models.PositiveIntegerField(blank=False)

forms.py

from django import forms
from django.core import validators
from django.contrib.auth.models import User
from account.models import UserProfile

class RegisterUserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta():
        model = User
        fields = ('username','email','password')

class RegisterUserInfoForm(forms.ModelForm):

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

views.py

from django.shortcuts import render
from account.forms import RegisterUserForm, RegisterUserInfoForm
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from django.contrib.auth.decorators import login_required

def register(request):
        registered = False

        if request.method == 'POST':
            user_form = RegisterUserForm(data=request.POST)

            if user_form.is_valid():
                user = user_form.save()
                user.set_password(user.password)
                user.save()

                registered = True

            else:
                print(user_form.errors)

        else:
            user_form = RegisterUserForm()

        return render(request,'account/register.html',{
            'user_form':user_form,
            'registered':registered,
        })

@login_required
def questionnaire(request):
    if request.method == 'POST':
        profile_form = RegisterUserInfoForm(request.POST, instance=request.user)
        if profile_form.is_valid():
            profile_form.save()
        else:
            print(profile_form.errors)
    else:
        profile_form = RegisterUserInfoForm(instance=request.user)
    return render(request,'account/questionnaire.html',{
        'profile_form':profile_form,
    })

register.html

{% extends 'base.html' %}

{% block body_block %}
  <div class="container">
    <h1>Register</h1>   
        <form method="post">
        {% csrf_token %}
        {{ user_form.as_p }}
        <input type="submit" name="btn btn-primary" value="Save">
      </form>
  </div>
{% endblock %}

questionnaire.html

{% extends 'base.html' %}

{% block body_block %}
<div class="container">
  <h1>questionnaire</h1>
  <form method="post">
    {% csrf_token %}
    {{ profile_form.as_p }}
    <input type="submit" name="" value="Save">
  </form>
</div>

{% endblock %}

【问题讨论】:

    标签: python django django-forms django-views django-users


    【解决方案1】:

    您的视图没有收到 POST 请求,因为您没有为表单标签提供操作属性。因此,您的表单无法通过您的 POST 请求。试试这样:

      <form action="" method="post">
        {% csrf_token %}
        {{ user_form.as_p }}
        <input type="submit" name="btn btn-primary" value="Save">
      </form>
    

    此外,您绝对应该检查 django 的内置通用视图:CreateViewUpdateView。他们正是为这些目的服务的,并且为您制作几乎所有东西。

    【讨论】:

    • 感谢您的回答,但您也没有提供操作:&lt;form action="" method="post"&gt; ,我的 register.html 正在运行,但问卷调查.html 没有
    • 我只是通过问卷调查.html 的例子向你展示了一个缺失的东西。显然,您也应该将相同的 action="" 代码添加到您的第二个模板中。
    • 恐怕没用
    • 在这种情况下你的输出是什么?
    • 我的问卷.html 页面中显示了年龄、体重、身高字段,因此我填写了它们。然后,当我单击按钮时,服务器在日志中显示“POST”,但没有任何反应。在 django 管理面板中,我没有看到任何这些字段已填写。
    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 2016-09-24
    • 2020-03-06
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2020-01-29
    • 2018-04-17
    相关资源
    最近更新 更多