繁体   English   中英

需要在Django Formset中具有必填字段和可选字段

[英]Need to have a Required and Optional Fields in Django Formset

我创建了一个最多可附加5张图像的表单集;

1-但我希望仅在用户未附加任何图像(ValidationError('atleast 1 image is required'))时运行(ValidationError('atleast 1 image is required'))

2-此程序还不允许用户保存我真正需要的1或2或3张图像。 因此,如果有1张图像或2张图像,则应将其保存。

3-我还需要默认选中1单选按钮,以使所选图像成为模板中显示的图像

模板

<form enctype="multipart/form-data" action="" method="post"> {% csrf_token %} 

{% for hidden in form.hidden_fields %}
    {{ hidden }}
{% endfor %}

{{ form.as_p }}

{{ formset.management_form }}
<div class="link-formset">

{% for choice in formset %}
<div>
  <label>{{ choice.media }}</label>
  <input type="radio" name="featured">{{choice.featured_image.label }}
</div>
{% endfor %}
</div>

<input type="submit" value="{{ submit_btn }}">
</form>

forms.py

class ProductImagesForm(forms.ModelForm):
    media = forms.ImageField(label='Image', required=True)
    featured_image = forms.BooleanField(initial=True, required=True)
class Meta:
        model = ProductImages
        fields = ['media', 'featured_image']

ImagesFormset = modelformset_factory(ProductImages, fields=('media', 'featured_image'), extra=5)

views.py

def form_invalid(self, form, formset):
        return self.render_to_response(self.get_context_data(form=form, formset=formset))

    def form_valid(self, form, formset):
        return HttpResponseRedirect(self.get_success_url())

    def get(self, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        formset = ImagesFormset(queryset=ProductImages.objects.none())
        return self.render_to_response(self.get_context_data(form=form, formset=formset))

    def post(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        formset = ImagesFormset(self.request.POST, self.request.FILES or None)
        form_valid = form.is_valid()
        formset_valid = formset.is_valid()
        if (form.is_valid() and formset.is_valid()):
            seller = self.get_account()
            form.instance.seller = seller
            self.object = form.save()
            images_set = formset.save(commit=False)
            for img in images_set:
                img.product = self.object
                img.save()
            formset.save()
            return self.form_valid(form, formset)
        else:
            return self.form_invalid(form, formset)

您始终可以将min_nummax_num传递min_num max_num

ImagesFormset = modelformset_factory(ProductImages, 
                                     fields=('media', 'featured_image'),  
                                     min_num=1,
                                     max_num=5,
                                     extra=5)

这样可以确保至少有1张图片,最多5张图片

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM