如何更新 Django 模型用户的名字、姓氏和电子邮件并更新单独模型中的其他字段

问题描述 投票:0回答:3

我已经使用 YT、StackOverflow、Django 文档和其他来源学习 Django 教程几周了。所以,也许我的问题没有意义。我希望你能理解我的问题。如果我的代码有任何错误或者您想给我一些建议,请回复我。

我在我的计算机上本地创建该网站。首先,我使用创建了一个注册页面和登录页面 姜戈模型。

用户登录网站后,在个人资料设置中,我创建了表单字段,如 first_namelast_nameemailmobile_numberdate_of_birthzip_codeaddresswebsite)生物

我有 models.py 用于帐户设置

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

# Create your models here.

class Account(models.Model):
    user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
    profile_photo = models.ImageField(upload_to='profile', null=True)
    mobile_number = models.PositiveBigIntegerField(null=True)
    date_of_birth = models.DateField(auto_now_add=False, auto_now=False, null= True)
    zip_code = models.IntegerField(null=True)
    address = models.CharField(max_length=225, null=True)
    website = models.URLField(max_length=100, null=True)
    bio = models.CharField(max_length=225, null=True)

forms.py

from django import forms
from .models import Account

class AccountForm(forms.ModelForm):
    class Meta:
        model = Account
        fields = '__all__'

模板中

<form class="form mx-auto my-5" method="POST" action="" enctype="multipart/form-data">
    <input name="user" type="hidden" value="{{request.user.id}}" required>
    <div class="form-row">
      <div class="col form-group">
        <label for="first_name" class="font-weight-bold">First name (required):</label>
        <input name="first_name" type="text" id="first_name" class="form-control" placeholder="First name" value="{% if request.user.first_name %}{{request.user.first_name}}{% endif %}" required>
      </div>
      <!-- <div class="col form-group">
        <label for="middle_name">Middle name (optional):</label>
        <input name="middle_name" type="text" id="middle_name" class="form-control" placeholder="Middle name">
      </div> -->
      <div class="col form-group">
        <label for="last_name">Last name (optional):</label>
        <input name="last_name" type="text" id="last_name" class="form-control" placeholder="Last name" value="{% if request.user.last_name %}{{request.user.last_name}}{% endif %}">
      </div>
    </div>
    <div class="form-group">
      <label for="email" class="font-weight-bold">Email address:</label>
      <input name="email" type="email" id="email" class="form-control" value="{{request.user.email}}" placeholder="Your email" required>
    </div>
    <div class="form-row">
      <div class="col form-group">
        <label for="mobile_number" class="font-weight-bold">Mobile number:</label>
        <input name="mobile_number" type="tel" id="mobile_number" class="form-control" placeholder="98********" required>
      </div>
      <div class="col form-group">
        <label for="date_of_birth" class="font-weight-bold">Date of birth:</label>
        <input name="date_of_birth" type="date" id="date_of_birth" class="form-control" required>
      </div>
      <div class="col form-group">
        <label for="zip_code" class="font-weight-bold">Zip code:</label>
        <input class="form-control" id="zip_code" name="zip_code" type="number" min="00000" max="99999" placeholder="55455">
      </div>
    </div>
    <div class="form-row">
      <div class="col form-group">
        <label for="address">Address:</label>
        <input name="address" type="text" id="address" class="form-control" placeholder="Bharatpur-07, Chitwan, Nepal">
      </div>
    </div>
    <div class="form-row">
      <div class="col form-group">
        <label for="website">Website:</label>
        <input name="website" type="url" id="website" class="form-control" placeholder="https://example.com/">
      </div>
    </div>
    <div class="form-row">
      <div class="col form-group">
        <label for="bio">Bio:</label>
        <textarea name="bio" class="form-control" id="bio" rows="5"></textarea>   
      </div>
      <div class="col form-group">
        <br><br>
        <span>Write something about your</span>
      </div>
    </div>
  <button class="btn btn-primary btn-md px-3 my-0 mr-0 float-right" type="submit">Submit</button
</form>

我在views.py中尝试过,它有效。

from django.shortcuts import render, redirect
from .forms import AccountForm
from django.contrib import messages
from django.contrib.auth.models import User

# Create your views here.
def profileSettingsPage(request, pid):
    form = AccountForm()
    if request.method == 'POST':
        form = AccountForm(request.POST, request.FILES)
        if int(request.POST.get('user')) == request.user.id:
            if form.is_valid():
                user = User.objects.get(pk=pid)
                 user.first_name = request.POST.get('first_name')
                 user.last_name = request.POST.get('last_name')
                 user.email = request.POST.get('email')
                 user.save()

                 form.save()

                 messages.success(request, 'Profile saved.')
                 return redirect('profile-settings', pid)
        else:
            messages.warning(request, 'Sorry! You enter other username.')
            return redirect('profile-settings', pid)
    context = {'form':form}
    return render(request, 'profile-settings.html', context) 

但是,我想在保存之前对名字、姓氏、电子邮件字段进行验证。我期待一些 is_valid() 能够保存。

另外,我尝试了一些新的东西

现在,在 views.py 中我添加了

from pages.forms import CreateUserForm

这是为注册页面创建的

然后,views.py看起来像这样:

from django.shortcuts import render, redirect
from .forms import AccountForm

from pages.forms import CreateUserForm

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

# Create your views here.
def profileSettingsPage(request, pid):
    form1 = AccountForm()
    form2 = CreateUserForm()
    if request.method == 'POST':
        form1 = AccountForm(request.POST, request.FILES)
        form2 = CreateUserForm(request.POST)
        if int(request.POST.get('user')) == request.user.id:
            if form1.is_valid() and form2.is_valid():
                form2.save()
                form1.save()

                messages.success(request, 'Profile saved.')
                return redirect('profile-settings', pid)
            else:
                messages.warning(request, 'Faile to saved profile')
                return redirect('profile-settings', pid)
        else:
            messages.warning(request, 'Sorry! You enter other username.')
            return redirect('profile-settings', pid)
    context = {'form1':form1, 'form2':form2}
    return render(request, 'profile-settings.html', context)

但是,这对我不起作用。 form1.is_valid()form2.is_valid() 无法传递 True 值并给我消息“无法保存配置文件。”

我的问题是,我想更新Django模型User的first_namelast_nameemail字段,其他字段单独更新到下一个模型。

还有一个问题

在上面的models.py中,我使用了ForeignKey()来获取用户(用户名或id)。

templates 中,我使用了 {{ request.user.id }} 来获取用户。

是否可以在不接触views.py,forms.pytemplates的情况下获取用户(id或用户名)?

编辑: 我在此链接上得到了答案: 我无法在 Django Views.py 中同时更新两个模型

python django
3个回答
0
投票

您可以简单地将上下文中的

user_id
传递给模板,然后使用它。


0
投票
class Account(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.SET_NULL)
    profile_photo = models.ImageField(upload_to='profile', null=True)
    mobile_number = models.PositiveBigIntegerField(null=True)
    date_of_birth = models.DateField(auto_now_add=False, auto_now=False, null= 
    True)
    zip_code = models.IntegerField(null=True)
    address = models.CharField(max_length=225, null=True)
    website = models.URLField(max_length=100, null=True)
    bio = models.CharField(max_length=225, null=True)

def profileSettingsPage(request):
    form1 = AccountForm()
    form2 = CreateUserForm()
    if request.method == 'POST':
        instance_user = User.objects.get(pk=request.user.id)
        instance_account = Account.objects.get(user=instance_user)
        form1 = AccountForm(request.POST, request.FILES,instance=instance_account)
        form2 = CreateUserForm(request.POST,instance=instance_user)

        if form1.is_valid() and form2.is_valid():
            form2.save()
            form1.save()
            messages.success(request, 'Profile saved.')
            return redirect('profile-settings')
        else:
            print(form1.errors)
            print(form2.errors)
            messages.warning(request, 'Faile to saved profile')
            return redirect('profile-settings')
    context = {'form1':form1, 'form2':form2}
    return render(request, 'profile-settings.html', context)

-1
投票
Hi can any one help me with these actually i am trying to save data with my registration page kindly check with code.    
this is the code  i have created 

 
class Employee(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=25)
    username = models.CharField(max_length=10, unique=True)
    password = models.CharField(max_length=12)
    date_of_birth = models.DateField(default=datetime.date.today)
    address = models.CharField(max_length=20)
    email = models.EmailField()
    phone_number = models.CharField(max_length=15)
    hire_date = models.DateField(default=datetime.date.today)
    job_title = models.CharField(max_length=10)
    department = models.CharField(max_length=10)
    salary = models.DecimalField(max_digits=10, decimal_places=2,null=True)
    is_active = models.BooleanField(default=True)
  
and please check with the form 

class EmployeeForm(ModelForm):
    class Meta:
        model = Employee
        fields = ["first_name","last_name","username","password","date_of_birth","address","email","phone_number","hire_date","job_title","department","salary","is_active"]


please check with views.py

def register(request):
    if request.method == "POST":          
        form = EmployeeForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'Registration done successfully.')
            return HttpResponseRedirect('register_info')
    else:
        form = EmployeeForm() 
    return render(request, "Emp/register.html", {'form': form})


html page 

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Employee Registration</title>
    <link rel="stylesheet" href="{% static 'css/register.css' %}">
    </head>
    <!-- <link rel="stylesheet" href="{% static 'static/emp.css' %}"> -->
    <body>
        <div class="container">
            <h2>Employee Registration</h2>
            <!-- <form method="POST" novalidate> -->
            <form action="{% url 'register_info' %}" method="post">
                {% csrf_token %}
               
                <div class="form-group">
                    <label for="first_name">First Name:</label>
                    <input type="text" id="first_name" name="first_name" required>
                </div>
                <div class="form-group">
                    <label for="last_name">Last Name:</label>
                    <input type="text" id="last_name" name="last_name" required>
                </div>
                <div class="form-group">
                    <label for="username">Username:</label>
                    <input type="text" id="username" name="username" required>
                </div>
                <div class="form-group">
                    <label for="password">Password:</label>
                    <input type="password" id="password" name="password" required>
                </div>
                <div class="form-group">
                    <label for="date_of_birth">Dob:</label>
                    <input type="datetime-local" id="datetime-local" name="datetime-local" required>
                </div>
                <div class="form-group">
                    <label for="address">Address:</label>
                    <input type="text" id="address" name="address" required>
                </div>
                <div class="form-group">
                    <label for="email">Email:</label>
                    <input type="email" id="email" pattern="+@gmail\.com" size="30" required />
                </div>
                <div class="form-group">
                    <label for="phone_number">Phone Number:</label>
                    <input type="number" id="phone_number" name="phone_number" required>
                </div>
                <div class="form-group">
                    <label for="hire_date">hire date:</label>
                    <input type="datetime-local" id="datetime-local" name="datetime-local" required>
                </div>
                <div class="form-group">
                    <label for="job_title">Job Title:</label>
                    <input type="text" id="job_title" name="job_title" required>
                </div>
                <div class="form-group">
                    <label for="department">Department:</label>
                    <input type="text" id="department" name="department" required>
                </div>
                <div class="form-group">
                    <label for="salary">Salary:</label>
                    <input type="number" id="salary" name="salary" min="10" max="100" />
                </div>
                <div class="form-group">
                    <label for="is_active">Is Active:</label>
                    <input type="checkbox" id="is_active" name="is_active" checked>
                </div>
                <div class="form-group">
                    <input type="submit" value="Register">
                </div>
            </form>
        </div>
    </body>
    </html>
© www.soinside.com 2019 - 2024. All rights reserved.