【发布时间】:2011-07-25 19:51:30
【问题描述】:
我有一些关于从 Django 的 modelAdmin 保存登录用户、save_model() 和 save_formset() 的问题,我想问一下。
假设我有一个模型,它接收用户通过 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
然后在我的views.py中:
def upload(request):
form = photoForm(request.POST, request.FILES)
if form_is_valid():
#do something useful
form.save()
这里有一个有趣的场景。我的 views.py 中的表单无效,因为模型中的 ['uploader'] 字段永远不会更新,它是必填字段,因此不会保存。
1) 如何让表单得到验证?
另外,在保存表单时,我看到了一个帖子here,它教了如何在 modelAdmin 中使用 save_model() 来保存 ForeignKey(User)。我已经尝试通过在我的 admin.py 中创建一个 photoAdmin 类来覆盖它,如链接所示:
class photoAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if not change:
obj.uploader = request.user
obj.save()
但它仍然无法使用 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 保存上传者字段时有什么问题,我应该如何更正它?一些示例代码会很有帮助。
我已经阅读了Admin site 上的 Django 文档,但它们并没有完全回答我的问题。任何启示将不胜感激。
【问题讨论】: