Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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
Python 我的modelformset_工厂不是保存图像(我使用了基于类的视图),而是在使用管理端时保存图像_Python_Django_Django Forms_Django Templates_Django Views - Fatal编程技术网

Python 我的modelformset_工厂不是保存图像(我使用了基于类的视图),而是在使用管理端时保存图像

Python 我的modelformset_工厂不是保存图像(我使用了基于类的视图),而是在使用管理端时保存图像,python,django,django-forms,django-templates,django-views,Python,Django,Django Forms,Django Templates,Django Views,我面临的挑战是,在创建新产品时不保存图像。表单呈现良好,图像已上载,但从未保存,直到我使用管理员上载并保存它时,它才会显示在我创建的产品上 我想我的类ProductCreateView()在views.py中缺少了一些东西,特别是在def post()中。 帮我弄清楚 型号.py def product_download(instance, filename): return '%s/%s' %(instance.product.slug, filename) class ProductI

我面临的挑战是,在创建新产品时不保存图像。表单呈现良好,图像已上载,但从未保存,直到我使用管理员上载并保存它时,它才会显示在我创建的产品上

我想我的类
ProductCreateView()
在views.py中缺少了一些东西,特别是在
def post()
中。 帮我弄清楚

型号.py

def product_download(instance, filename):
  return '%s/%s' %(instance.product.slug, filename)

class ProductImages(models.Model):
    product = models.ForeignKey(Product)
    title = models.CharField(max_length=120)
    media = models.ImageField(upload_to=product_download, 
        width_field='max_width', 
        height_field='max_height',
        null=True, blank=True)
    max_width = models.CharField(max_length=100, null=True, blank=True)
    max_height = models.CharField(max_length=100, null=True, blank=True)
    featured_image = models.BooleanField(default=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

    def __unicode__(self):
        return unicode(self.media)
视图.py

def product_download(instance, filename):
  return '%s/%s' %(instance.product.slug, filename)

class ProductImages(models.Model):
    product = models.ForeignKey(Product)
    title = models.CharField(max_length=120)
    media = models.ImageField(upload_to=product_download, 
        width_field='max_width', 
        height_field='max_height',
        null=True, blank=True)
    max_width = models.CharField(max_length=100, null=True, blank=True)
    max_height = models.CharField(max_length=100, null=True, blank=True)
    featured_image = models.BooleanField(default=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

    def __unicode__(self):
        return unicode(self.media)
表单很好地保存了它的信息,但是formset没有保存图像

from .forms import ProductModelForm, ProductImagesForm, ImagesFormset

class ProductCreateView(CreateView):

    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)
        form_valid = form.is_valid()
        formset_valid = formset.is_valid()
        if form_valid and formset_valid:
            user = self.request.user
            form.instance.user = user
            self.object = form.save()
            media = formset.save(commit=False)
            for img in media:
                if hasattr(self.model, 'product'):
                    img.save()
                    formset = self.object
            formset.save()  
            return self.form_valid(form, formset)
        else:
            return self.form_invalid(form, formset)
forms.py

class ProductImagesForm(forms.ModelForm):
    media = forms.ImageField(label='Image')
    featured_image = forms.BooleanField(initial=True) 

    def __init__ (self, *args, **kwargs):
        super(ProductImages, self).__init__(*args, **kwargs)
        self.fields['featured_image'] = forms.BooleanField( widget = forms.RadioSelect(attrs={'checked': 'true'}, choices=((self.prefix, 'featured'),)))


    def add_prefix(self, field):
        if field == 'featured_image': return field
        else: return self.prefix and ('%s-%s' % (self.prefix, field)) or field

    class Meta:
        model = ProductImages
        fields = ['media', 'featured_image', ]
    ImagesFormset = modelformset_factory(ProductImages, fields=('media', 'featured_image'), extra=1, max_num=4)
模板

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

{{ form.as_p }}

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

{{  formset .as_p }}

</div>
</form>
{%csrf\u令牌%}
{{form.as_p}}
{{formset.management_form}
{{formset.as_p}}

如果这个答案是错的,请原谅我的错误

我认为错误就在这里

for img in media:
    img.product = self.object
    img.save()
    #why assigning formset to self.object? , try removing this.
    #self.object is form.save(), ie, already saved.
    #formset = self.object

经过长时间的阅读,我终于找到了缺失的部分,通过将图像与产品关联起来,并将其保存并很好地生成图像

if form_valid and formset_valid:
            seller = self.get_account()
            form.instance.seller = seller
            self.object = form.save()
            media = formset.save(commit=False)
            for img in media:
                img.product = self.object
                img.save()
            formset.save()

这样更简单,只需将其与产品关联即可解决问题

if form_valid and formset_valid:
            seller = self.get_account()
            form.instance.seller = seller
            self.object = form.save()
            media = formset.save(commit=False)
            for img in media:
                img.product = self.object
                img.save()
            formset.save()

我不明白你在
如果有效的话
块中做什么。据我所知,您从未设置过
self.model
,因此您将永远无法访问
img.save()
。那么
formset=self.object
的意义是什么呢?填充缺失片段的最佳方法是什么?但是这会产生一个例外。RelatedObjects不在/seller/products/add/ProductImages的文本列表中没有产品。有什么例外吗?RelatedObjects不在/seller/products/add/ProductImages的文本列表中没有产品。self.object是所谓的产品对象吗?是的,它是相关对象