【问题标题】:Parameter passed in save() difficult to understandsave() 传入的参数难以理解
【发布时间】:2017-01-21 03:05:36
【问题描述】:

我正在从一本最受推荐和有益的书《Django By Example》中学习 Django。有一个名为书签的项目。我现在被困在用于下载图像并将图像对象保存到数据库的表单部分。我可以理解验证部分(clean_url)和下载部分。我无法进入传递给 save() 的参数

保存(self, force_insert=False, force_update=False, commit=True)

并保存图像对象

image.image.save(image_name, ContentFile(response.read()), save=False)

这个函数在哪里用到了force_insert和force_update?

我也不理解 image.image.save() 中的参数部分,因为图像具有标题、url、描述、图像等字段。image_name 指的是什么?我认为 response.read() 部分用于图像字段。

谁能帮我解释清楚?

这里是代码

class Image(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             related_name='images_created')
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, blank=True)
    url = models.URLField()
    image = models.ImageField(upload_to='images/%Y/%m/%d')
    description = models.TextField(blank=True)
    created = models.DateTimeField(auto_now_add=True,
                                   db_index=True)
    users_like = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                        related_name='images_liked',
                                        blank=True)

views.py

def image_create(request):
    """
    View for creating an Image using the JavaScript Bookmarklet.
    """
    if request.method == 'POST':
        # form is sent
        form = ImageCreateForm(data=request.POST)
        if form.is_valid():
            # form data is valid
            cd = form.cleaned_data
            new_item = form.save(commit=False)
            # assign current user to the item
            new_item.user = request.user
            new_item.save()
            messages.success(request, 'Image added successfully')
            # redirect to new created item detail view
            return redirect(new_item.get_absolute_url())
    else:
        # build form with data provided by the bookmarklet via GET
        form = ImageCreateForm(data=request.GET)

    return render(request, 'images/image/create.html', {'section': 'images',
                                                        'form': form})

forms.py

class ImageCreateForm(forms.ModelForm):

    class Meta:
        model = Image
        fields = ('title', 'url', 'description')
        widgets = {
            'url': forms.HiddenInput,
        }

    def clean_url(self):
        url = self.cleaned_data['url']
        valid_extensions = ['jpg', 'jpeg']
        extension = url.rsplit('.', 1)[1].lower()
        if extension not in valid_extensions:
            raise forms.ValidationError('The given URL does not match valid image extensions.')
        return url

    def save(self, force_insert=False, force_update=False, commit=True):
        image = super(ImageCreateForm, self).save(commit=False)
        image_url = self.cleaned_data['url']
        image_name = '{}.{}'.format(slugify(image.title),
                                    image_url.rsplit('.', 1)[1].lower())

        # download image from the given URL
        response = request.urlopen(image_url)
        image.image.save(image_name,
                         ContentFile(response.read()),
                         save=False)
        print('image',image)

        if commit:
            image.save()
        return image

更新

要创建图像,我必须使用此 url localhost:8000/images/create/?title=title for image&url=http://www.demo.com/image/image.jpg

【问题讨论】:

  • 我觉得这里有两种不同的保存方法,一种是保存Form,第一种在你的例子中,第二种是保存ImageField,第二种在你的例子中

标签: python django python-3.x django-models django-forms


【解决方案1】:
image = super(ImageCreateForm, self).save(commit=False)

在此语句中,我们将超级函数分配给可变图像。

使用 ImageCreateForm 调用 super 方法。然后无论 super() 方法返回什么,我们调用 forms.ModelForm 的 save() 方法,commit=False。

现在,如果您查看模型图像,您会发现类型为 models.ImageField 的“图像”属性

为了便于理解,我将模型的“image”属性重命名为“image_of_model”

ImageField 有表单的方法 save

save(name,content, save)

image.image.save(image_name,
                     ContentFile(response.read()),
                     save=False)

根据我给定的术语,上述陈述变为。

image.image_of_model.save(image_name,
                     ContentFile(response.read()),
                     save=False)

我希望这能解决你的困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2011-06-22
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多