【发布时间】: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