Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改/删除Django表单集中的图像_Django_Sorl Thumbnail_Formset - Fatal编程技术网

更改/删除Django表单集中的图像

更改/删除Django表单集中的图像,django,sorl-thumbnail,formset,Django,Sorl Thumbnail,Formset,我使用一个表单集上传图像,并使用多个关系将它们链接到一个模型。我在状态表单下方显示表单集,以便用户填写状态字段并添加图像,然后单击«保存»或«保存并添加另一图像» 在最后一种情况下,它应该显示预填充的状态表单,然后在表单集中显示一个块,其中包含处理上载文件的常用内容(指向图像的链接、要删除的复选框和要上载不同图像的文件输入),最后是一个空白文件输入以上载第二个图像。现在,我有两个空白文件输入 表单集知道已经上载了1个图像,但它不显示任何内容来管理它。这是表单集中ImageField的正常行为,还

我使用一个表单集上传图像,并使用多个关系将它们链接到一个模型。我在状态表单下方显示表单集,以便用户填写状态字段并添加图像,然后单击«保存»或«保存并添加另一图像»

在最后一种情况下,它应该显示预填充的状态表单,然后在表单集中显示一个块,其中包含处理上载文件的常用内容(指向图像的链接、要删除的复选框和要上载不同图像的文件输入),最后是一个空白文件输入以上载第二个图像。现在,我有两个空白文件输入

表单集知道已经上载了1个图像,但它不显示任何内容来管理它。这是表单集中ImageField的正常行为,还是我提供表单集数据的方式有问题

代码如下:

# Models
class Image(models.Model):
    image = ImageField(upload_to='uploads/status/images/',)


class Status(models.Model):
    author = models.ForeignKey(User,)
    images = models.ManyToManyField(Image, blank=True, null=True)
    body = models.TextField()

# Forms
class StatusForm(forms.ModelForm):
    class Meta:
        model = Status
        fields = ['body',]


class ImageForm(forms.ModelForm):
    class Meta:
        model = Image
        fields = ['image',]

# View
@csrf_protect
def form(request, id=None, template_name='status/form.html'):
    if id:
        status = get_object_or_404(Status, pk=id)
        images = status.images.all().values()
    else:
        status = Status(author=request.user)
        images = None

    if request.method == 'POST':
        form = StatusForm(request.POST, instance=status)
        formset = ImageFormSet(request.POST, request.FILES, initial=images)

        if form.is_valid():
            try:
                status = form.save()

                if formset.is_valid():
                    try:
                        for form in formset:
                            image = form.save()
                            status.images.add(image)
                            status.save()

                        if request.POST.get('_add_image', None):
                            return HttpResponseRedirect(reverse('status_edit', args=[status.id]))
                        else:
                            messages.success(request, 'Status saved')
                            return HttpResponseRedirect(request.POST.get('next', '/'))
                    except:
                        messages.error(request, 'Technical error')
            except:
                messages.error(request, 'Technical error')
    else:
        form = StatusForm(instance=status)
        formset = ImageFormSet(initial=images)

    return render_to_response(template_name, {
        'form': form,
        'formset': formset,
        'next': request.GET.get('next', '/'),
    }, context_instance=RequestContext(request))
模板:

<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.non_field_errors }}
    <input type="hidden" name="next" value="{{ next }}" />
    {{ form.body }}
    {{ form.body.errors }}
    <hr />
    {{ formset }}
    <hr />
    <div class="pull-right">
        <input name="_add_image" class="btn" type="submit" value="Add another image">
        <input name="_complete" class="btn btn-primary" type="submit" value="Save">
    </div>
</form>

{%csrf_令牌%}
{{form.non_field_errors}}
{{form.body}}
{{form.body.errors}}

{{formset}}
M2M关系是“正常”的。由于目前的设计,内联表单集要求有一个外键返回到正在编辑的主对象。唯一存在的地方是M2M关系的联接表(Django术语中的“through”模型)。该模型本身通常只包含两个外键,一个外键指向关系的每一侧


我曾经尝试过创建一个自定义表单,其中包括模型上所有要编辑的字段以及普通选择字段,以选择一个现有字段,然后从表单中的字段创建一个新实例,并将其分配给唯一的实际字段外键。然而,要编写的代码很多,其中大多数都是独特的,针对每个使用场景,而且很脆弱(您必须认识到始终保持表单和模型同步)。我最终放弃了这个想法。也许有一天,Django会为此提供一些机制,但现在,最好还是处理一下。

好吧,我没意识到这一点。所以我想我必须显示现有的图像并添加一个简单的输入文件来添加一个新的。谢谢你的回答。