首页 > 编程问答 >在django中以一对一的关系保存表单数据

在django中以一对一的关系保存表单数据

时间:2024-08-03 15:49:20浏览次数:13  
标签:python django

我与 Django 用户模型和自定义配置文件模型具有一对一的关系。我尝试在用户注册时同时保存用户和个人资料数据。但问题是配置文件模型的数据未验证且数据未保存在数据库中 这是代码

model.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    picture = models.ImageField(upload_to = 'profile_pictures')
    Join_as = models.CharField(choices=USER_CHOICES, max_length=70)
    date = models.DateField(auto_now_add=True)

form.py

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['picture','Join_as']
        labels = {
            'picture':'Upload Profile Picture'
        }
        widgets = {
            'Join_as':forms.Select(attrs={'class':'form-select'}),
            }

view.py

def register(request):
    if request.method == 'POST':
        user_form = UserCreationForm(request.POST)
        profile_form = ProfileForm(request.POST, request.FILES)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
        return HttpResponseRedirect('/')
    else:
        user_form = UserCreationForm()
        profile_form = ProfileForm()
    context = {'user_form':user_form,'profile_form':profile_form}
    return render(request, 'registration/register.html', context)

register.html

<form action="" method="POST" enctype='multipart/form-data'>
    {% csrf_token %}
    <div class="row row-cols-2">
        {% for user in user_form  %}
        <div class="col">
            {{user.label_tag}} {{user}} {{user.errors|striptags}}
        </div>
        {% endfor %}
        {% for profile in profile_form %}
        <div class="col">
            {{profile.label_tag}} {{profile}} {{profile|striptags}}
        </div>
        {% endfor %}
    </div>
    <input type="submit" value="Register" class="btn btn-success">
</form>

问题出在保存表单数据的方式上。当你调用 profile_form.save() 时,它并不知道与哪个用户关联。

以下是修改后的 view.py 中的 register 函数,它展示了如何正确保存用户和配置文件数据:

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from .forms import ProfileForm

def register(request):
    if request.method == 'POST':
        user_form = UserCreationForm(request.POST)
        profile_form = ProfileForm(request.POST, request.FILES)
        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save()  # 保存用户
            profile = profile_form.save(commit=False)  # 创建配置文件实例,但不保存
            profile.user = user  # 将用户关联到配置文件
            profile.save()  # 保存配置文件
            return redirect('/')  # 重定向到主页或登录页面
    else:
        user_form = UserCreationForm()
        profile_form = ProfileForm()
    context = {'user_form': user_form, 'profile_form': profile_form}
    return render(request, 'registration/register.html', context)

关键变化:

  1. user = user_form.save() : 我们首先保存用户表单,这将创建一个新的用户对象并返回它。
  2. profile = profile_form.save(commit=False) : 我们调用 profile_form.save() ,但传入 commit=False 。 这将创建一个配置文件实例,但不会立即将其保存到数据库中。
  3. profile.user = user : 我们将保存的用户对象分配给配置文件实例的 user 字段。
  4. profile.save() : 最后,我们调用 profile.save() 将配置文件实例(现在已与用户关联)保存到数据库中。

通过这些更改,的注册视图现在应该能够正确创建用户并同时保存其配置文件信息。

标签:python,django
From: 66723586

相关文章

  • 如何使用 BeautifulSoup python 查找选择标签的选定选项值
    我正在尝试从python中的htmlselect标签获取选定的值。好吧,当选项属性设置为selected="selected"时,它是成功的,但我试图废弃的网站具有不同的选项属性,例如:-html="""<select><optionvalue="">Pleaseselectavlalue</option><o......
  • 12:Python元组属性
    #元组tuple,元素不可被修改,不能被增加或则删除tu=(111,'alex',(11,22),[(33,44)],True,33,44,)#一般写元组的时候,最后可以加个逗号不报错print(tu)tu=(111,'alex',(11,22),[(33,44)],True,33,44,)v=tu[0]#元组索引print(v)tu=(111,'alex',(11,2......
  • 如何在venv python中安装requirements.txt
    我是Python虚拟环境的初学者,在安装requirements.txt文件时遇到问题。问题是,当我运行命令来安装requirements.txt文件时,没有安装任何内容。平台:WindowsVS代码镜像如何解决这个问题?没有正确激活虚拟环境。请按照以下步骤操作:1.激活虚拟环境:在VSC......
  • 【代码随想录】图论复习(Python版)
    深度优先搜索1.搜索过程一个方向搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)2.代码框架回溯法的代码框架:defbacktracking(参数):if终止条件:存放结果returnfor选择本层集合中的元素(树中节点孩子的数量......
  • 【Python】数据类型之字符串
    本篇文章将继续讲解字符串其他功能:1、求字符串长度功能:len(str)  ,该功能是求字符串str的长度。代码演示:2、通过索引获取字符串的字符。功能:str[a]  str为字符串,a为整型。该功能是获取字符串str索引为a处的字符。注意:字符串的索引是从0开始的。代码演示:注意......
  • 【Python】python基础
    本篇文章将讲解以下知识点:(1)循环语句(2)字符串格式化(3)运算符一:循环语句循环语句有两种:while   for本篇文章只讲解while循环格式:while 条件:  代码(只有条件为真的时候,此代码才会被执行,此处的代码可以是多行代码)(1)循环语句基本使用示例1:此处代码执行过程:1<3......
  • python 爬虫入门实战——爬取维基百科“百科全书”词条页面内链
    1.简述本次爬取维基百科“百科全书”词条页面内链,仅发送一次请求,获取一个html页面,同时不包含应对反爬虫的知识,仅包含最基础的网页爬取、数据清洗、存储为csv文件。爬取网址url为“https://zh.wikipedia.org/wiki/百科全书”,爬取内容为该页面所有内链及内链标识(下图蓝......
  • Python:match()和search()的区别
    在Python中,match()和search()函数通常与正则表达式(regularexpressions)一起使用,特别是在re模块中。尽管它们都用于搜索字符串中的模式,但它们在搜索行为上有关键的区别。re.match()re.match()函数尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()......
  • Python:range()函数的用法
    range()函数是Python中一个内置函数,用于生成一个数字序列。这个函数通常用于在for循环中迭代一个指定的次数。range()函数可以接收一到三个参数,分别是起始值(start)、结束值(stop)和步长(step),但步长是可选的,默认值为1。基本用法两个参数:range(start,stop)生成一个从star......
  • 第一个Django工程创建及运行
    认识DjangoDjango是一个高级PythonWeb框架,它鼓励快速开发和简洁、实用的设计。它由经验丰富的开发人员构建,解决了Web开发的大部分麻烦,因此您可以专注于编写应用程序,而无需重新发明轮子。它是免费和开源的。快得离谱。Django旨在帮助开发人员尽快将应用程序从概念到......