如何从Django表单获取数据并在用户每次提交时存储到不同变量
在Django中每次提交表单时将数据存入不同变量的方法
我来给你梳理下两种常见的实现方式,你可以根据自己的实际需求来选:
场景1:单次提交内把表单数据存入多个变量
如果是想在用户一次提交表单后,把post字段的数据赋值给多个用途不同的变量(比如处理成不同格式),可以这么做:
首先先定义你的表单:
# forms.py from django import forms class PostForm(forms.Form): post = forms.CharField(label='提交内容', max_length=500)
然后在视图里处理表单提交,获取数据并分配给不同变量:
# views.py from django.shortcuts import render from .forms import PostForm def submit_post(request): if request.method == 'POST': form = PostForm(request.POST) # 先验证表单数据合法性 if form.is_valid(): # 从cleaned_data里取数据,这是Django推荐的安全方式 post_content = form.cleaned_data['post'] # 根据你的需求赋值给不同变量 raw_content = post_content # 存原始内容 upper_content = post_content.upper() # 存转成大写的内容 preview_content = post_content[:100] + '...' # 存预览版内容 # 接下来你可以用这些变量做任何操作,比如渲染到模板里 context = { 'raw': raw_content, 'upper': upper_content, 'preview': preview_content } return render(request, 'result.html', context) else: # GET请求时显示空表单 form = PostForm() return render(request, 'submit_form.html', {'form': form})
场景2:多次提交时,每次数据存入不同的"变量"(保存历史提交)
如果是想让用户每次提交的post数据都单独存起来(比如像历史记录一样,第一次提交存到第一个"变量",第二次存到第二个),可以用会话(session)或者数据库来实现:
用Session临时保存(适合不需要永久存储的情况)
# views.py from django.shortcuts import render from .forms import PostForm def submit_post(request): # 初始化会话里的提交列表,不存在就创建一个空列表 if 'post_history' not in request.session: request.session['post_history'] = [] if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): post_content = form.cleaned_data['post'] # 把本次提交的内容添加到历史列表里 request.session['post_history'].append(post_content) # 必须设置modified=True,不然会话不会保存修改 request.session.modified = True # 现在历史列表里的每个元素就是每次提交的"变量",比如第一个提交是post_history[0],第二个是post_history[1] context = { 'form': form, 'all_submissions': request.session['post_history'], 'last_submission': request.session['post_history'][-1] # 取最后一次提交 } return render(request, 'submit_form.html', context) else: form = PostForm() context = { 'form': form, 'all_submissions': request.session.get('post_history', []) } return render(request, 'submit_form.html', context)
用数据库永久保存(适合需要长期留存数据的情况)
先定义一个模型来存储提交记录:
# models.py from django.db import models class PostSubmission(models.Model): content = models.TextField() submitted_at = models.DateTimeField(auto_now_add=True) # 自动记录提交时间 def __str__(self): return self.content[:20] + '...'
然后在视图里每次提交时创建模型实例:
# views.py from django.shortcuts import render from .forms import PostForm from .models import PostSubmission def submit_post(request): if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): post_content = form.cleaned_data['post'] # 创建新的记录存入数据库 new_submission = PostSubmission(content=post_content) new_submission.save() # 可以获取所有提交记录,每条记录就是一次提交的"变量" all_submissions = PostSubmission.objects.all().order_by('-submitted_at') context = { 'form': form, 'all_submissions': all_submissions, 'new_submission': new_submission } return render(request, 'submit_form.html', context) else: form = PostForm() context = { 'form': form, 'all_submissions': PostSubmission.objects.all().order_by('-submitted_at') } return render(request, 'submit_form.html', context)
关键提醒
- 永远用
form.cleaned_data来获取表单数据,不要直接用request.POST['post'],因为cleaned_data会自动做数据验证和类型转换,能避免很多安全问题和错误。 - 如果用Session存储,记得设置
request.session.modified = True,否则Django不会保存你对会话的修改。
内容的提问来源于stack exchange,提问作者Qasim Khan
相关产品推荐
相关产品推荐

