2011-03-30 72 views
1

我想了解一些有关从Django的modelAdmin中保存登录用户save_model()和save_formset()的一些信息。Django User Foreignkey,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(用户)。我已经试过这overiding中所示的链接,在我的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文档,但它们并不完全回答我的问题。任何启发将不胜感激。

回答

7

让我们来处理你的第一个关于你的观点的问题。正如你所说,这不是一个有效的形式,因为上传不提供。排除ModelForm中的用户字段和exclude元类属性(因为我们打算自动插入它)。

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. 

你约的ModelAdmin的第二个问题:

没有,save_model()ModelAdmin方法,它有没有在你的views.py,与你form。当正在编辑的对象的ModelForm已验证时,save_modelModelAdmin上被调用。

您的代码ModelAdmin应该像您一样工作,除非您的表单丢失了一些错误。如果您需要进一步的建议,您将不得不告诉我您得到了哪些错误!


2)什么时候save_model()和 save_formset()实际上被调用?

表单和表单验证通过后。

3) save_formset()和save_model()之间有什么区别?

save_model是正在编辑的模式,即任何模型您注册的ModelAdmin与

save_formset是用于保存表单集(ModelAdmin.inlines

4)将save_model()或save_formset()当我在上面的views.py中简单地调用 form.save()时,会引发 ?

不,他们为什么?它们与您的views.py表单完全无关。 save_model()是一个ModelAdmin方法,而不是一个Form方法。

5)有什么不对我的 两个方法验证在views.py 形式以及与request.user保存上传现场 ,我应该怎么 纠正呢?一些示例代码将是 很有帮助。

正如您所说,验证失败,因为需要上传器。如果您始终打算设置上传器字段,请参阅上面的代码示例以防止验证错误。

希望有帮助!

+0

谢谢!那就是诀窍。对于奇怪的问题抱歉,但似乎对ModelAdmin中的save_models存在误解。我认为它与从views.py创建的模型有关,并且每当创建模型时都会被调用。尽管如此,我还是不太清楚在什么情况下你可以调用AdminModel类。它只在与Django的管理站点(/ admin /)相关时才使用? – evkwan 2011-03-30 12:30:14

+0

'ModelAdmin'是严格管理网站。只有django.contrib.admin调用模型管理员。 – 2011-03-30 14:17:36

+0

哦,是啊!你的例子在2小时的摆弄之后做了诀窍!你达人。 – 2014-01-25 06:43:10