表单对象没有属性'save_m2m'django

时间:2017-05-26 09:40:31

标签: python django django-forms django-views django-class-based-views

我在视图中遇到一些问题,我创建了CBV CreateView。所以它运行良好,它保存表单,但我有错误'ProductForm'对象没有属性'save_m2m,如果我不使用form.save_m2m它不会添加图像到我的产品,但会将其添加到媒体。

所以我们这里有model.py

<html ng-app="ui.bootstrap.demo">
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-animate.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-sanitize.js"></script>
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-2.5.0.js"></script>
    <script src="example.js"></script>
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
  </head>

<div ng-controller="ButtonsCtrl">
    <pre>{{changeDataset}}</pre>
    <div class="btn-group">
        <label uib-btn-radio="0" ng-change="newDataset()" ng-model="changeDataset" class="btn btn-default">0</label>
        <label uib-btn-radio="1" ng-change="newDataset()" ng-model="changeDataset" class="btn btn-default">1</label>
        <label uib-btn-radio="undefined" ng-change="newDataset()" ng-model="changeDataset" class="btn btn-default">undefined</label>
    </div>
</div>
</html>

这里我有forms.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')

这是views.py

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'
            })

3 个答案:

答案 0 :(得分:0)

尝试像这样编辑你的视图,

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)

答案 1 :(得分:0)

尝试这样

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

答案 2 :(得分:0)

ve rewrote my model with adding new varialble to Media. And in view i已从

更改
product.images.add(media)

product.media_set.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图像