在保存表单之前,我正在尝试更改表单的实例。我需要在视图中设置如下某些信息:
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/uploaded/bucket是空的:
错误表格:
但我确实陷害了他们!我是否需要让它们成为blank=True,然后进行保存(commit=false),更改它们,然后重新保存?若然,为甚麽会这样?我确实改变了表格..。
发布于 2012-05-23 15:38:54
作业迟到了。在__init__() of ModelForm中,或者在您的代码中:form = UploadForm(request.POST, request.FILES)行,表格的形式。以后对实例的修改不会影响form.initial的值。
此外,如果要在后端自动填写某些字段,请不要将它们呈现给用户。
因此,是的,您可以让他们blank=True或将它们排除在表单之外然后跟随建议的方式。
发布于 2012-05-25 18:23:02
试试这个:
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-06-17 12:09:55
实际上你在这里做了一些奇怪的事情。
第一:为什么要分配给company_id、uploaded_by_id和bucket_id?但是yout在您的模型中得到了这些字段--它是为该模型创建的表中列的名称--您应该直接在这里使用ORM特性,例如form.instance.company = r_user.company。
第二:表单验证应用于form.fields而不是它的实例属性,一旦表单被创建并限制到提供的值,您就不能更改它们。
向Django中的form创建的实例添加一些字段值的推荐方法(正如我一直认为的那样)是像您所做的那样创建自定义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文档这里中描述了这个解决方案
https://stackoverflow.com/questions/10723054
复制相似问题