2

我正在尝试在保存表单之前更改它的实例。我需要在视图中设置某些信息,如下所示:

 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()

现在,我知道该表单无效,因为公司/上传/存储桶是空的:

错误表格:

  • 公司
  • 这是必填栏。
  • 这是必填栏。
  • 上传者
  • 这是必填栏。
  • 但我确实设置了它们!我是否需要将它们设为空白=True,然后保存(提交=false),更改它们,然后重新保存?如果是,为什么会这样?我确实改变了表格....

    4

    3 回答 3

    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()
    

    这样您就可以在创建表单之前设置数据。

    于 2012-05-25T18:23:02.780 回答
    1

    作业迟到了。在__init__()ofModelForm或您的代码中:form = UploadForm(request.POST, request.FILES)行中,已创建一个实例并将其填充到initialform。以后对实例的修改不会影响form.initial.

    此外,如果您想在后端自动填写某些字段,请不要将它们呈现给用户。

    因此,是的,您可以制作它们blank=True将它们从表单中排除,然后按照建议的方式进行操作。

    于 2012-05-23T15:38:54.030 回答
    0

    实际上,您在这里做了一些奇怪的事情。

    第一:你为什么分配给company_iduploaded_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()你 call form_object = form.save(commit=False)。现在您的模型实例已经填写了表单中的所有字段,因此您可以添加您想要的内容:例如form_object.company = r_user.company。最后不要忘记调用save()模型实例本身将其存储在您的数据库中。

    该解决方案在此处的 Django 文档中进行了描述

    于 2012-06-17T12:09:55.413 回答