首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在保存之前更改表单实例Django

在保存之前更改表单实例Django
EN

Stack Overflow用户
提问于 2012-05-23 15:22:56
回答 3查看 5.9K关注 0票数 3

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

代码语言:javascript
复制
 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)

--

代码语言:javascript
复制
class UploadForm(ModelForm):

    class Meta:
        model = UploadedFile    

--

代码语言:javascript
复制
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/uploaded/bucket是空的:

错误表格:

  • 公司
  • 此字段为必填字段。
  • 桶,桶
  • 此字段为必填字段。
  • uploaded_by
  • 此字段为必填字段。

但我确实陷害了他们!我是否需要让它们成为blank=True,然后进行保存(commit=false),更改它们,然后重新保存?若然,为甚麽会这样?我确实改变了表格..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-23 15:38:54

作业迟到了。在__init__() of ModelForm中,或者在您的代码中:form = UploadForm(request.POST, request.FILES)行,表格的形式。以后对实例的修改不会影响form.initial的值。

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

因此,是的,您可以让他们blank=True将它们排除在表单之外然后跟随建议的方式

票数 1
EN

Stack Overflow用户

发布于 2012-05-25 18:23:02

试试这个:

代码语言:javascript
复制
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()

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

票数 2
EN

Stack Overflow用户

发布于 2012-06-17 12:09:55

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

第一:为什么要分配给company_iduploaded_by_idbucket_id?但是yout在您的模型中得到了这些字段--它是为该模型创建的表中列的名称--您应该直接在这里使用ORM特性,例如form.instance.company = r_user.company

第二:表单验证应用于form.fields而不是它的实例属性,一旦表单被创建并限制到提供的值,您就不能更改它们。

向Django中的form创建的实例添加一些字段值的推荐方法(正如我一直认为的那样)是像您所做的那样创建自定义ModelForm,并在Meta类中指定允许用户编辑的所有字段。就你的情况而言:

代码语言:javascript
复制
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文档这里中描述了这个解决方案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10723054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档