Django用户外键,save_model和save_formset

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文档,但它们并没有完全回答我的问题.任何启蒙都会受到高度赞赏.

Yuj*_*ita 7

让我们来处理您关于自己观点的第一个问题.正如你所说,它不是一个有效的形式,因为没有提供上传器.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保存上传器字段时的方法有什么问题,我应该如何纠正它?一些示例代码会有很大帮助.

正如您所说,验证失败,因为需要上传器.如果您总是计划设置上传器字段,请使用上面的代码示例来防止验证错误.

希望有所帮助!