2016-09-30 146 views
2

我試圖讓用戶手動輸入文本字段,如果他們有許可證信息,或讓它自動生成(基於表單信息),如果它的原始內容。在Django中,如何在保存前添加一個新的值給request.POST數據?

我被卡住了,因爲從我的測試(使用打印命令)窗體正確更新與表單中給出的信息如果LicenseTag字段留空。問題是更新的信息沒有被保存在數據庫中。經過研究,這似乎是一個不變性的問題,這就是爲什麼我加了request.POST.copy()並測試了註釋掉的部分定義mutability=True

這裏是我的views.py

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) 

這是我forms.py。

from django import forms 
from django.core.validators import MinLengthValidator 

from .models import UploadedFiles 


class NewUpload(forms.ModelForm): 


    class Meta: 
     model = UploadedFiles 
     fields = ('Title', 'STL','Photo','Description', 'Category', 'SubCategory', 'SubSubCategory', 'LicenseTag') 
+0

什麼是您的模型?你的表格是什麼?你爲什麼試圖修改POST?幾乎從不需要那 – e4c5

+0

我已經添加了我的模型和表單。我想要做的就是根據用戶輸入表單數據創建一個數據庫條目。如果還有另一種方式來做到這一點,那麼我如何建議我接受任何其他想法。 – RknRobin

回答

1

正如我所看到的,最好的方法是覆蓋模型中的保存方法。

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 
+0

這是96%正確的,但我想讓我的liscname嘗試full_name,display_name,然後按照該順序發送電子郵件。我怎麼會在liscname變量中檢查3個而不是2個呢?作品完美的保存到分貝,但! – RknRobin

+0

非常感謝! – RknRobin

相關問題