为什么我的django modelformsets在用户上传数据后会被预填充?

qcbq4gxm  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(77)

所以,我有一个django模型表单集,允许用户在一个虚假的电子商务网站上上传多个列表。当用户第一次访问“上传页面”时,表单是清晰的,没有问题。不过,在用户上传了一些项目之后,django似乎是在用用户之前提交的信息预先填充表单。我不想这样,我也不知道该怎么预防。以下是forms.py:

class ProductModelForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = [
            "product_name",
            "product_description",
            "product_price",
        ]

class ProductImageModelForm(forms.ModelForm):
    class Meta:
        model = ProductImage
        fields = [
            "product_image",
        ]

ProductModelFormSet = modelformset_factory(
    Product,
    fields=(
        "product_name",
        "product_description",
        "product_price",
    ),
    extra=3,
)

ProductImageModelFormSet = modelformset_factory(
    ProductImage,
    fields=(
        "product_image",
    ),
    extra=3,
)

字符串
下面是处理它的视图:

@login_required
def product_upload_view(request):
    if request.method == "POST":
        product_form_set = ProductModelFormSet(request.POST)
        product_image_form_set = ProductImageModelFormSet(request.POST, request.FILES)
        if (product_form_set.is_valid() and product_image_form_set.is_valid()):
            for obj, obj_image in zip(product_form_set.save(commit=False), product_image_form_set.save(commit=False)):
                obj.product_seller = request.user
                obj.product_pub_date = timezone.now()
                obj.product_image = obj_image
                obj_image.save()
                obj.save()
        return HttpResponseRedirect("somewhere/else/")
                

    product_form_set = ProductModelFormSet()
    product_image_form_set = ProductImageModelFormSet()
    return render(request, "products/upload.html", {
        "product_form_set": product_form_set,
        "product_image_form_set": product_image_form_set,
    })


现在,我不知道我是否解释了我的问题,因为我似乎在网上找不到答案,但我相信其他人也有过同样的问题。基本上,当用户第一次尝试上传内容时,表单集是完全空的,并且一切正常。然后,在他们上传并被重定向到另一个页面之后,如果他们再次尝试上传,表单将预先填充前一个表单集中的数据,这似乎只是在最后附加了一个全新的表单集。我只是想要一个全新的,新鲜的表单集,就像你可以做的所有常规表单(包括模型表单)。我错过了什么吗?谢谢你的帮助!

fzwojiic

fzwojiic1#

也许有点古怪,但如果你想在提交表单后重置 ModelFormset,只需在提交后用空的 FormSet 渲染页面,如下所示:

return render(request, "your_template.html", {"formset": YourFormset(queryset=YourModel.objects.none(), initial=[{
            "some_attr": "some_value", "some_attr2": "some_value2"
            }])}

字符串
如果设置为空 queryset,则没有数据可显示。我甚至使用 initial 参数将一些初始数据设置为表单。

相关问题