如何更新first_name,last_name&Django模型用户的电子邮件,并在单独的模型中更新其他字段 [英] How can I update first_name, last_name & email of Django model User and update other field in separate models

查看:44
本文介绍了如何更新first_name,last_name&Django模型用户的电子邮件,并在单独的模型中更新其他字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用YT,StackOverflow,Django文档和其他资源学习Django教程了几周.因此,也许我的问题变得毫无道理.希望您能理解我的问题.如果我的代码有任何错误,或者您想给我一些建议,请回复我.

I have been learning the Django tutorial for a few weeks using YT, StackOverflow, Django documentation, and other sources. So, maybe my question goes out of the sense. I hope you will understand my question. If anything is a mistake on my code or you want to give me some suggestions, then reply to me.

我在计算机上本地创建该站点.首先,我创建了一个注册页面和登录页面,使用Django模型.

I make the site locally on my computer. First of all, I have created a signup page and login page using Django Model.

用户登录网站后,在个人资料设置中,我创建了以下表单字段,例如名字姓氏电子邮件移动电话号码出生日期邮政编码地址网站生物.

After User login the site, In profile settings, I have created form field like first_name, last_name, email, mobile_number, date_of_birth, zip_code, address, website, bio, etc.

我有 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 中尝试过,它有效.

I tried in views.py, it worked.

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().

But, I want to validate for first_name, last_name, email field before saving. I was expecting some is_valid() to save.

此外,我尝试一些新内容

现在,在我添加的 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 值,并给我消息无法保存的个人资料".

But, This is not worked for me. form1.is_valid() and form2.is_valid() can not pass True value and give me message "Failed to saved profile."

我的问题是,我想更新Django模型用户的名字姓氏电子邮件字段,而其他字段则分别更新更新到下一个模型.

My question is, I want to update the first_name, last_name, email field of the Django model User, and other fields are separately updated to the next model.

另一个问题

在上面的 models.py 中,我已经使用 ForeignKey()来获取用户(用户名或ID).

In the above models.py, I have use ForeignKey() to get the User(username or id).

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

In templates, I have used {{ request.user.id }} to get user.

是否可以获取用户(ID或用户名)而无需触摸 views.py, forms.py 模板?

Is it possible to get User (id or username) without touching views.py, forms.py and templates?

修改:我在此链接上得到了答案:我在无法在Django Views.py

推荐答案

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)

这篇关于如何更新first_name,last_name&amp;Django模型用户的电子邮件,并在单独的模型中更新其他字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆