evk*_*wan 1 forms django models
我有一些关于保存登录用户的事情,save_model()和save_formset()来自Django的modelAdmin,我想问一下.
考虑一下,我有一个模型,用于拍摄用户通过http POST上传的照片.
在models.py中:
class photo(models.Model):
title = models.CharField(max_length=50)
img = models.ImageField(upload_to='photocollection')
uploader = models.ForeignKey(User)
latitude = models.FloatField(null=True, blank=True)
longitude = models.FloatField(null=True, blank=True)
def save(self):
#Retain the model instance to do some processing before saving:
self.latitude = exif.getGPSLatitude(self.img)
self.longitude = exif.GPSLongitude(self.img)
return super(photoCollection, self).save()
class photoForm(ModelForm):
class Meta:
model = photo
Run Code Online (Sandbox Code Playgroud)
然后在我的views.py中:
def upload(request):
form = photoForm(request.POST, request.FILES)
if form_is_valid():
#do something useful
form.save()
Run Code Online (Sandbox Code Playgroud)
在这里,我有一个有趣的场景.我的views.py中的表单无效,因为模型中的['uploader']字段永远不会更新,并且它是必填字段,因此不会保存.
1)如何获得表格验证?
另外,在保存表单时,我在这里看到了一篇文章,讲述了如何使用modelAdmin中的save_model()来保存ForeignKey(用户).通过在admin.py中创建一个photoAdmin类,我已尝试覆盖链接中显示的内容:
class photoAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if not change:
obj.uploader = request.user
obj.save()
Run Code Online (Sandbox Code Playgroud)
但它仍然无法使用request.user或request.user.username保存上传器字段.我尝试覆盖save_formset(),因为我在views.py中使用了photoForm.仍然无济于事.
2)什么时候实际调用save_model()和save_formset()?
3)save_formset()和save_model()有什么区别?
4)当我在上面的views.py中调用form.save()时,是否会引发save_model()或save_formset()?
5)我在验证views.py中的表单以及使用request.user保存上传器字段时的方法有什么问题,我应该如何纠正它?一些示例代码会有很大帮助.
我在管理站点上阅读过Django文档,但它们并没有完全回答我的问题.任何启蒙都会受到高度赞赏.
让我们来处理您关于自己观点的第一个问题.正如你所说,它不是一个有效的形式,因为没有提供上传器.ModelForm使用excludeMeta类属性从您的用户字段中排除(因为我们计划自动插入它).
class photoForm(ModelForm):
class Meta:
model = photo
exclude= ('uploader',)
if form_is_valid(): # uploader has been excluded. No more error.
photo = form.save(commit=False) # returns unsaved instance
photo.uploader = request.user
photo.save() # real save to DB.
Run Code Online (Sandbox Code Playgroud)
关于ModelAdmin的第二个问题:
不,save_model()是一种ModelAdmin方法,它没有任何关系,与你form在你的views.py.当正在编辑的对象已经过验证时save_model调用.ModelAdminModelForm
您的代码ModelAdmin应该按照您的方式工作,除非您的表单出现了一些错误.如果您需要进一步的建议,你必须告诉我你有什么错误!
2)什么时候实际调用save_model()和save_formset()?
在验证表单和表单集之后.
3)save_formset()和save_model()有什么区别?
save_model 适用于正在编辑的模型,即您在ModelAdmin中注册的任何模型
save_formset用于保存formsets(ModelAdmin.inlines)
4)当我在上面的views.py中调用form.save()时,是否会引发save_model()或save_formset()?
不,他们为什么会这样?它们与您的views.py表单完全无关.save_model()是一个ModelAdmin方法,而不是Form方法.
5)我在验证views.py中的表单以及使用request.user保存上传器字段时的方法有什么问题,我应该如何纠正它?一些示例代码会有很大帮助.
正如您所说,验证失败,因为需要上传器.如果您总是计划设置上传器字段,请使用上面的代码示例来防止验证错误.
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
2462 次 |
| 最近记录: |