Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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 表单对象没有属性';保存m2m和x27;德扬戈_Python_Django_Django Forms_Django Views_Django Class Based Views - Fatal编程技术网

Python 表单对象没有属性';保存m2m和x27;德扬戈

Python 表单对象没有属性';保存m2m和x27;德扬戈,python,django,django-forms,django-views,django-class-based-views,Python,Django,Django Forms,Django Views,Django Class Based Views,我在视图中使用表单时遇到一些问题,我创建了CBV CreateView。因此,它工作正常,并保存了表单,但我有一个错误'ProductForm'对象没有属性'save\u m2m,如果我不使用form.save\u m2m,它不会将图像添加到我的产品中,但会将其添加到媒体中 这里我们有model.py class Product(models.Model): class Meta: verbose_name = 'Продукт' verbose_name

我在视图中使用表单时遇到一些问题,我创建了CBV CreateView。因此,它工作正常,并保存了表单,但我有一个错误'ProductForm'对象没有属性'save\u m2m,如果我不使用form.save\u m2m,它不会将图像添加到我的产品中,但会将其添加到媒体中

这里我们有model.py

class Product(models.Model):
    class Meta:
        verbose_name = 'Продукт'
        verbose_name_plural = 'Продукты'

    shop = models.ForeignKey(Shop, verbose_name='Название магазина')
    category = models.ForeignKey(Category, verbose_name='Название категории')
    title = models.CharField(max_length=255, verbose_name='Название товара')
    slug = models.SlugField(_("Название на транслите"), max_length=50, unique=True, blank=True, null=True)
    price = models.DecimalField(null=True, blank=True, verbose_name='Цена', decimal_places=0, max_digits=10)
    sell_count = models.PositiveIntegerField(_("Количество продаж"), default=0, null=True, blank=True)
    discount = models.PositiveIntegerField(null=True, blank=True, verbose_name='Скидка')
    currency = models.CharField(null=True, max_length=255, verbose_name='Валюта', default='сом')
    quantity = models.IntegerField(verbose_name='Количество', default=0)
    delivery_type = models.CharField(verbose_name='Вид доставки', choices=DELIVERY_TYPES, default='self',
                                     max_length=255)
    delivery_cost = models.FloatField(verbose_name='Стоимость доставки', default=0, null=True, blank=True)
    # settings = models.ManyToManyField('ProductSettings', verbose_name='Характеристика')
    availability = models.CharField(_("Наличие"), max_length=100, choices=AVAILABILITY_TYPES, default='available')
    published = models.BooleanField(default=True)
    short_description = models.TextField(max_length=300, null=True, blank=True,
                                         verbose_name='Короткое описание товара до 300 символов')
    long_description = RichTextUploadingField(null=True, blank=True, verbose_name='Полное описание')
    images = models.ManyToManyField('Media', verbose_name='Изображения продукта', blank=True)
    objects = ProductPublishedManager()



class Media(models.Model):
    class Meta:
        verbose_name = "Изображение"
        verbose_name_plural = "Изображения"

    image = models.ImageField(upload_to='images')
这是我的表格

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        exclude = ['slug', 'objects', 'sell_count']

    removed_images = forms.CharField(required=False)
    uploaded_images = forms.CharField(required=False)

    def __init__(self, *args, **kwargs):
        self.user = kwargs['initial']['user']
        super(ProductForm, self).__init__(*args, **kwargs)
        self.fields['shop'].queryset = Shop.objects.filter(user__in=[self.user.id])
        for field in iter(self.fields):
            self.fields[field].widget.attrs.update({
                'class': 'form-control'
            })
这里是views.py

class ProductCreateView(LoginRequiredMixin, AddProductMixin, CreateView):
    form_class = ProductForm
    template_name = 'product/product_form.html'

    def get_success_url(self):
        return reverse('shops:detail', args=(self.object.shop.slug,))

    def get_initial(self):
        return {'shop': Shop.objects.get(slug=self.kwargs['slug']),
                'user': self.request.user
                }

    def form_valid(self, form, **kwargs):
        product = form.instance
        product.slug = slugify(form.instance.title)
        product.shop = Shop.objects.get(slug=self.kwargs['slug'])
        form.save()
        if form.cleaned_data['uploaded_images']:
            if ',' in form.cleaned_data['uploaded_images']:
                for item in form.cleaned_data['uploaded_images'].split(','):
                    try:
                        media = Media.objects.get(id=int(item))
                        product.images.add(media)
                    except ObjectDoesNotExist:
                        pass
            else:
                try:
                    media = Media.objects.get(id=int(form.cleaned_data['uploaded_images']))
                    product.images.add(media)
                except ObjectDoesNotExist:
                    print('error')
        form.save_m2m()
        if form.cleaned_data['removed_images']:
            for item in form.cleaned_data['removed_images'].split(','):
                try:
                    media = Media.objects.get(id=int(item))
                    image_path = MEDIA_ROOT + '/' + media.image.name
                    os.remove(image_path)
                    media.delete()
                except ObjectDoesNotExist:
                    pass

        return super(ProductCreateView, self).form_valid(form)

试着像这样编辑视图

def form_valid(self, form, **kwargs):
    product = form.save(commit=False)
    product.slug = slugify(form.instance.title)
    product.shop = Shop.objects.get(slug=self.kwargs['slug'])
    product.save()
    if form.cleaned_data['uploaded_images']:
        if ',' in form.cleaned_data['uploaded_images']:
            for item in form.cleaned_data['uploaded_images'].split(','):
                try:
                    media = Media.objects.get(id=int(item))
                    product.images.add(media)
                except ObjectDoesNotExist:
                    pass
        else:
            try:
                media = Media.objects.get(id=int(form.cleaned_data['uploaded_images']))
                product.images.add(media)
            except ObjectDoesNotExist:
    # **Edited here**..
    product.save_m2m()
    if form.cleaned_data['removed_images']:
        for item in form.cleaned_data['removed_images'].split(','):
            try:
                media = Media.objects.get(id=int(item))
                image_path = MEDIA_ROOT + '/' + media.image.name
                os.remove(image_path)
                media.delete()
            except ObjectDoesNotExist:
                pass

    return super(ProductCreateView, self).form_valid(form)
像这样试试

form.save(commit=False)
form.save_m2m()

我已经重写了我的模型,在媒体中添加了新的变量。在我看来,我已经从

product.images.add(media)

还有我的模特

class Media(models.Model):
class Meta:
    verbose_name = "Изображение"
    verbose_name_plural = "Изображения"

image = models.ImageField(upload_to='images')
products = models.ManyToManyField(Product)

def __str__(self):
    return self.image.url

在类产品中,我删除了var图像

我在代码中没有看到
commit=False
。Django仅在调用form.save(commit=False)时添加save_m2m属性…哦,对不起,如果我使用form.save(commit=False),它会给这个exeption“在使用这个多对多关系之前,对象需要有一个字段“product”的值。”可能我必须在另一个地方使用form.save(commit=False),但是我不知道我必须在哪里使用这个功能。。执行
obj=form.save(commit=False)
然后执行
obj.save()
然后执行
form.save()。但是,只有在使用save(commit=False)
时,才需要提到有关
save\u m2m()的文档。
在表单上使用简单的save()时,所有数据(包括多对多数据)都会被保存,而不需要任何额外的方法调用。是的!文档有,你说得对,但我不知道为什么它不保存所有数据–包括多对多数据,好的,我将尝试保存对象。我,尝试编辑代码,它没有将媒体图像添加到产品中,没有错误。但当我添加form.save_m2m()时,它会将图像添加到产品中。但是exeption是ProductForm is object没有属性'save_m2m'django(这是django的一个bug)for form.save_m2m要工作,您需要执行form.save(commit=False),这可能是问题所在。。。。编辑代码有什么异常?我解决了,只是重写了模型。对于类媒体,在product.images.add(媒体)到product.Media\u set.add(媒体)中添加了产品变量(带有多对多字段)和重写视图
class Media(models.Model):
class Meta:
    verbose_name = "Изображение"
    verbose_name_plural = "Изображения"

image = models.ImageField(upload_to='images')
products = models.ManyToManyField(Product)

def __str__(self):
    return self.image.url