Python 在Django中,如何在保存之前向request.POST数据添加新值?
我试图允许用户手动输入一个文本字段,如果他们有许可证信息,或者让它自动生成(基于表单信息)如果其原始内容 我被卡住了,因为在我的测试中(使用print命令),如果LicenseTag字段留空,那么表单将使用表单中给出的信息正确更新。问题是更新的信息没有保存在数据库中。经过研究,这似乎是一个不变性的问题,这就是为什么我添加了Python 在Django中,如何在保存之前向request.POST数据添加新值?,python,django,request,immutability,Python,Django,Request,Immutability,我试图允许用户手动输入一个文本字段,如果他们有许可证信息,或者让它自动生成(基于表单信息)如果其原始内容 我被卡住了,因为在我的测试中(使用print命令),如果LicenseTag字段留空,那么表单将使用表单中给出的信息正确更新。问题是更新的信息没有保存在数据库中。经过研究,这似乎是一个不变性的问题,这就是为什么我添加了request.POST.copy(),并测试了注释掉的定义mutability=True的部分 这是我的观点 def STLupload(request): if r
request.POST.copy()
,并测试了注释掉的定义mutability=True
的部分
这是我的观点
def STLupload(request):
if request.method == 'POST':
form = NewUpload(request.POST, request.FILES)
data = request.POST.copy()
if form.is_valid():
#Dis gona need alot of work
firstname = request.user.first_name
lastname = request.user.last_name
displayname = request.user.display_name
email = request.user.email
if (firstname or lastname == "None"):
if displayname == "None":
liscname = email
else:
liscname = '%s %s' % (firstname, lastname)
else:
liscname = displayname
filetitle = request.POST.get(
'Title'
, '')
lisc = '%s %s' % (filetitle, liscname)
if data['LicenseTag'] == "":
'''
mutable = request.POST._mutable
request.POST._mutable = True
request.POST['LicenseTag'] = lisc
request.POST._mutable = mutable
'''
data['LicenseTag'] = lisc
print (request.POST.get(
'LicenseTag'
, ''))
print ("blank")
else:
print (form)
#Save current username
comment = form.save(commit=False)
comment.user = request.user
comment.save()
#Flash success message
messages.add_message(request, messages.SUCCESS, "File uploaded successful")
# Redirect to the document list after POST
return HttpResponseRedirect(reverse_lazy('STLup'))
else:
form = NewUpload() # A empty, unbound form
有人能帮我找出如何将生成的信息保存到我的数据库中吗
编辑#1
Models.py
from django.db import models
import os
#import django.db.models.deletion
from django.db import models
from django.core.exceptions import ValidationError
from django.core.files.storage import FileSystemStorage
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from django.conf import settings
from django.contrib.auth.models import User
# Create your models here.
def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
return os.path.join('uploads', str(instance.Title), filename)
def validate_file_extension(value):
ext = os.path.splitext(value.name)[1]
valid_extensions = ['.stl','.STL']
if not ext in valid_extensions:
raise ValidationError(u'Please upload a .stl file type only')
def validate_img_extension(value):
ext = os.path.splitext(value.name)[1]
valid_extensions = ['.jpg','.png','.JPG']
if not ext in valid_extensions:
raise ValidationError(u'Please upload a .jpg or .png only')
class UploadedFiles(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL, blank=True, null=True)
STL = models.FileField(_('STL Upload'),
upload_to=user_directory_path, validators=[validate_file_extension])
Photo = models.ImageField(_('Photo'),
upload_to=user_directory_path, validators=[validate_img_extension])
Title = models.CharField(_('Title of object'),
max_length=40, blank=False, null=True, unique=False)
Category = models.CharField(_('Category'),
max_length=40, blank=False, null=True, unique=False)
SubCategory = models.CharField(_('SubCategory'),
max_length=40, blank=True, null=True, unique=False)
SubSubCategory = models.CharField(_('*SubSubCategory (optional)'),
max_length=40, blank=True, null=True, unique=False)
FileType = models.BooleanField(_('Local?'),
default=0, unique=False)
Description = models.TextField(_('File Description'),
max_length=200, blank=True, null=True, unique=False)
LicenseTag = models.CharField(_('*License (optional, leave blank for original content)'),
max_length=200, blank=True, null=True, unique=False)
Xdim_mm = models.IntegerField(_('X dimension (mm)'),
default=0)
Ydim_mm = models.IntegerField(_('Y dimension (mm)'),
default=0)
Zdim_mm = models.IntegerField(_('Z dimension (mm)'),
default=0)
pub_date = models.DateTimeField(_('date_joined'), default=timezone.now)
在我看来,最好的方法是重写模型中的save方法
class UploadedFiles(models.Model):
def save(self, *args, **kwargs):
if not self.LicenseTag:
if self.user:
liscname = self.user.get_full_name() or self.user.email
self.LicenseTag = "{0} {1}".format(liscname, self.Title)
super(UploadFiles,self).save(*args,**kwargs)
然后,同样的事情在你的管理工作,而不必做很多艰苦的工作。我已经自由地优化了许可证标签的派生方式
现在你的观点变得简单多了
def STLupload(request):
if request.method == 'POST':
form = NewUpload(request.POST, request.FILES)
if form.is_valid():
lisc = '%s %s' % (filetitle, liscname)
#Save current username
comment = form.save(commit=False)
comment.user = request.user
comment.save()
#Flash success message
messages.add_message(request, messages.SUCCESS, "File uploaded successful")
# Redirect to the document list after POST
return HttpResponseRedirect(reverse_lazy('STLup'))
else:
form = NewUpload() # A empty, unbound form
我认为最好的方法是保存(commit=False),然后添加必填字段
form = MyForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.licence = 'your license code'
obj.save()
你的型号是什么?你的表格是什么?你为什么要修改帖子?几乎没有必要这样做,我已经添加了我的模型和表单。我只想根据用户输入的表单数据创建一个数据库条目。如果有其他方法可以做到这一点,那么我建议我接受任何其他想法。这是96%正确的,但我希望我的liscname尝试全名、显示名,然后依次发送电子邮件。如何让它检查liscname变量中的3而不是2?不过,它非常适合保存到数据库!
form = MyForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.licence = 'your license code'
obj.save()