我有一个允许用户上传图片的表单。如果他们没有上传图片,则会显示默认图片。我希望如果他们不上传图片,则禁用图片字段。我认为表格末尾的if语句可行 - 但它没有。这是form.py:
的形式class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'description', 'url', 'product_type', 'price', 'image', 'image_url']
labels = {
'name': 'Product Name',
'url': 'Product URL',
'product_type': 'Product Type',
'description': 'Product Description',
'image': 'Product Image',
'image_url': 'Product Image URL',
'price': 'Product Price'
}
widgets = {
'description': Textarea(attrs={'rows': 5}),
}
if Product.image is None:
form.fields['image'].disabled = True
这里是models.py:
class Product(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=100)
description = models.CharField(max_length=300)
price = models.DecimalField(max_digits=10, decimal_places=2)
url = models.CharField(max_length=200)
product_type = models.CharField(max_length=100)
image = models.ImageField(upload_to='product_images', default='product_images/default.png', null=True)
image_url = models.CharField(max_length=200, blank=True)
likes = models.IntegerField(default=0)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('index', kwargs={})
我尝试删除默认=' product_images / default.png' - 这似乎不起作用。我尝试了null = True,这似乎让页面崩溃了。我错过了什么?
这是相关的部分模板:
{% if product.image.url %}
{% if product.image_url %}
<img class="img-fluid" src="{{ product.image_url }}" />
{% endif %}
<img class="img-fluid" src="{{ product.image.url }}" />
{% endif %}
这显示了两种类型的图像 - 上传到本地,并链接到外部。我试图解决的问题是默认图像出现在外部图像下方 - 我想隐藏默认图像。我很早就学习了Django和Python,所以如果我搞砸了,我会道歉。
答案 0 :(得分:1)
我认为您想要的并不是禁用表单中的ImageField。只需尝试为模型中的图片字段设置blank=True
,然后移除default
参数。
# models.py
class Product(models.Model):
...
image = models.ImageField(upload_to='product_images', blank=True, null=True)
# image_url = models.CharField(max_length=200, blank=True) # Remove this field, you don't need it.
...
此外,从模型和表单中删除image_url
。
然后在模板中输入如下内容:
{% if product.image %}
<img class="img-fluid" src="{{ product.image.url }}" />
{% else %}
<img class="img-fluid" src="/media/product_images/default.png" />
{% endif %}
答案 1 :(得分:0)
您可以使用Form
__init__()
方法更改字段:
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'description', 'url', 'product_type', 'price', 'image', 'image_url']
labels = {
'name': 'Product Name',
'url': 'Product URL',
'product_type': 'Product Type',
'description': 'Product Description',
'image': 'Product Image',
'image_url': 'Product Image URL',
'price': 'Product Price'
}
widgets = {
'description': Textarea(attrs={'rows': 5}),
}
def __init__(self, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs)
if self.instance:
# If the instance has no image, they haven't uploaded anything
if self.instance.image is None:
# Alter the field in the form
self.fields['image'].disabled = True
你必须小心你所引用的内容。例如,Product.image
将为您提供Product
类的属性,该属性不是None
,因为您已将其分配为models.ImageField()
。您想引用Product
的实例,这是您可以从ModelForm().instance
获得的内容。