Python 在Django中,如何在保存之前向request.POST数据添加新值?

Python 在Django中,如何在保存之前向request.POST数据添加新值?,python,django,request,immutability,Python,Django,Request,Immutability,我试图允许用户手动输入一个文本字段,如果他们有许可证信息,或者让它自动生成(基于表单信息)如果其原始内容 我被卡住了,因为在我的测试中(使用print命令),如果LicenseTag字段留空,那么表单将使用表单中给出的信息正确更新。问题是更新的信息没有保存在数据库中。经过研究,这似乎是一个不变性的问题,这就是为什么我添加了request.POST.copy(),并测试了注释掉的定义mutability=True的部分 这是我的观点 def STLupload(request): if r

我试图允许用户手动输入一个文本字段,如果他们有许可证信息,或者让它自动生成(基于表单信息)如果其原始内容

我被卡住了,因为在我的测试中(使用print命令),如果LicenseTag字段留空,那么表单将使用表单中给出的信息正确更新。问题是更新的信息没有保存在数据库中。经过研究,这似乎是一个不变性的问题,这就是为什么我添加了
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()