2012-05-23 29 views
0

我想在保存之前更改表單的實例。我需要這樣的觀點中設置的某些信息:在保存之前更改表單實例Django

class UploadedFile(models.Model): 

    file = models.FileField(storage=s3store, upload_to=custom_upload_to) 
    slug = models.SlugField(max_length=50, blank=True) 
    bucket = models.ForeignKey(S3Bucket, blank=False) 
    uploaded_by = models.ForeignKey(User, related_name='uploaded_by', blank=False) 
    company = models.ForeignKey(Company, blank=False) 

-

class UploadForm(ModelForm): 

    class Meta: 
     model = UploadedFile  

-

form = UploadForm(request.POST, request.FILES) 
form.instance.company_id = r_user.company.id 
form.instance.uploaded_by_id = r_user.id 
form.instance.bucket_id = r_user.company.s3_bucket_id 
if form.is_valid(): 
    form_object = form.save() 

現在,我得到的形式是無效的,因爲公司/上傳/存儲桶爲空:

錯誤表格:

  • company
  • This字段是必需的。
  • bucket
  • 此字段是必填項。
  • uploaded_by
  • 此字段是必填項。
  • 但我確實設置了它們!我是否需要讓它們變爲空= True,然後執行保存(commit = false),更改它們,然後重新保存?如果是,爲什麼會這樣?我確實改變了形式......

    回答

    2

    試試這個:

    data = request.POST.copy() 
    data['company_id'] = r_user.company.id 
    data['uploaded_by_id'] = r_user.id 
    data['bucket_id'] = r_user.company.s3_bucket_id 
    
    form = UploadForm(data, request.FILES) 
    if form.is_valid(): 
        form_object = form.save() 
    

    這種方式創建窗體之前要設置的數據。

    0

    其實你在這裏做了一些奇怪的事情。

    第一張: 爲什麼你分配到company_id,uploaded_by_idbucket_id?但是,您的模型中包含這些字段 - 它是爲此模型創建的表中的列名 - 您應直接在此處使用ORM功能,例如, form.instance.company = r_user.company

    第二個: 表單驗證應用於form.fields而不是它的實例屬性,並且一旦創建了表單並綁定到提供的值,您就無法更改它們。

    向Django中的窗體創建的模型實例中添加一些字段值的建議方法(就像我一直以爲的那樣)是創建自定義的ModelForm,並在Meta類中指定您希望允許用戶編輯的所有字段。對於您的情況:

    class UploadForm(ModelForm): 
    
        class Meta: 
         model = UploadedFile 
         fields = ('file', 'slug') 
    

    然後,而不是調用form_object = form.save()你打電話form_object = form.save(commit=False)。現在,您已經完成了填充表單中所有字段的模型實例,因此您可以添加所需內容:例如form_object.company = r_user.company。最後,不要忘記在模型實例本身上調用save()將其存儲在數據庫中。

    它在Django文檔中描述的解決方案here

    相關問題