【问题标题】:How to mimic upload_to function in models with ordinary form如何在普通形式的模型中模拟 upload_to 函数
【发布时间】:2020-09-06 20:30:22
【问题描述】:

嗨,我有这个模型、表单、视图、设置让我们说

models.py

class ProfileModel(models.Model):
   user = Foreignkey(get_user_model()...) 
   first_name = forms.CharField(....) # some attrs
   photo = models.ImageField(uploads_to='uploads/%Y/%m/%d', ...)

forms.py

class ProfileForm(forms.Form):
   first_name = forms.CharField()
   photo = forms.ImageField()

   def handle(self, request, *args, **kwargs):
       data = self.cleaned_data
       # update the profile model
       Profile.objects.filter(user__exact=request.user).update(**data) 

views.py

def update_profile(request):
    if request.method == 'POST':
       form = forms.ProfileForm(request.DATA, request.FILES)
       if form.is_valid():
          # update here via handle of form
          form.handle(request, *args, **kwargs)
       else:
          #... something 

settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

这里的想法只是使用表单来更新模型(不是模型表单)。

通过管理员,upload_to 似乎工作 例如上传图片,url = /media/uploads/..../photo

当它出现在我的表单中时,它只识别 /media/ 而不是upload_to,[顺便说一句,它的工作就是它的行为] 例如上传图片,url = /media/photo

它似乎没有触发upload_to,

我知道模型形式的好处,但在这种情况下,有什么办法吗?

【问题讨论】:

    标签: python django


    【解决方案1】:
    def comment_update(request,pk):
    context ={} 
    comment = get_object_or_404(Comment,pk=pk)
    post_pk = comment.post.pk
    form = CommentForm(request.POST or None, instance = comment)
    if request.user == comment_user:
        if form.is_valid(): 
            form.save() 
            return redirect('src:detail',pk=post_pk)
    context["form"] = form 
    return render(request, "comment_form.html", context) 
    

    注释是型号名称 这种方式很容易更新现有数据。 pk 是主键。

    【讨论】:

    • 我相信 form.save() 是一种模型形式的方法?是我的错,应该是request.POST。请以它为例
    • 啊,我明白了,我只是搜索实例=...它将表单作为模型的实例。
    【解决方案2】:

    Shah Vipul,答案很好。

    但是考虑到上面的代码,

    这是一个奇怪的更新()不识别upload_to

    我在这里做的是。

    forms.py [我的错误应该是 ProfileModel 而不是 Profile]。

    ...
    def handle(...):
        user = request.user
        photo = self.clean_data.pop('photo')
    
        ProfileModel.objects.filter(user__exact=user).update(**data)
        user.profile.photo = photo
        user.profile.save(update_fields=['photo',])
    

    似乎有效,但如果有人能解释这是为什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      相关资源
      最近更新 更多