【问题标题】:Django - How to Save ImageField Even if Form is Not ValidDjango - 即使表单无效也如何保存 ImageField
【发布时间】:2015-10-27 16:42:15
【问题描述】:

我有一个相当标准的模型和形式。我有一些带有 ImageField 的必填字段。当用户选择了一张图片并且没有填写必填字段时,图片不会保存,用户需要再次“重新上传”。

由于数据库中的行已经存在(因为此表单是“向导”的一部分),我不介意将图片保存在数据库中,即使所有表单对所有必需数据都无效。

这就是我现在的观点,当您填写所有必填字段时,它会起作用:

def my_view(request):
    instance = MyModel.objects.get(user=request.user)
    form = MyForm(instance=instance)

    if request.POST:
        form = MyForm(request.POST, request.FILES, instance=instance)
        if form.is_valid():
            new_instance = form.save(commit=False)

            if request.FILES and request.FILES['photo']:
                uploaded_photo = request.FILES['photo']
                new_instance.photo = uploaded_photo

            new_instance.save()
            return HttpResponseRedirect(reverse('new_url'))

    return render_to_response('current_template.html', locals(), context_instance=RequestContext(request))

这是我尝试将图片保存在数据库中的内容,即使其他字段未填写,但我收到错误 Django 上传错误 - 上传有效图片(不是图片或已损坏)

def my_view(request):
    instance = MyModel.objects.get(user=request.user)
    form = MyForm(instance=instance)

    if request.POST:
        form = MyForm(request.POST, request.FILES, instance=instance)

        if request.FILES and request.FILES['photo']:
            uploaded_photo = request.FILES['photo']
            instance.photo = uploaded_photo
            instance.save()

        if form.is_valid():
            new_instance = form.save()
            return HttpResponseRedirect(reverse('new_url'))

    return render_to_response('current_template.html', locals(), context_instance=RequestContext(request))

这是我的表格(相当简单):

class MyForm(ModelForm):
    first_name = forms.CharField(label='First Name', max_length=50, required=True)
    last_name = forms.CharField(label='Last Name', max_length=50, required=True)
    photo = forms.ImageField(required=False)

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)

    class Meta:
        model = MyModel
        fields = ('first_name','last_name', 'photo')

这是我的模型(同样非常简单):

class MyModel(models.Model):
    first_name = models.TextField(max_length=50)
    last_name = models.TextField(max_length=50)
    photo = ImageField(upload_to=get_photo_path,null=True,blank=True)

【问题讨论】:

    标签: django django-models django-1.4 imagefield


    【解决方案1】:

    这就是我让它工作的方式。请注意,当表单无效时,在“else”中没有“request.FILES”作为表单构造函数的参数。这就是让 Django 显示错误消息的原因。

    if form.is_valid():
        instance = form.save(commit=False)
    
        if request.FILES and request.FILES['photo']:
            instance = save_photo(instance, request.FILES['photo'])
    
        instance.save()
        return HttpResponseRedirect(reverse('url'))
    else:
        if request.FILES and request.FILES['photo']:
            instance = save_photo(instance, request.FILES['photo'])
            form = InstanceForm(request.POST, instance=instance)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2022-06-20
      • 2015-10-13
      • 2018-05-26
      相关资源
      最近更新 更多