2017-10-29 13 views
2

私はユーザーがイメージをアップロードできるフォームを持っています。アップロードしていない場合、デフォルトの画像が表示されます。画像をアップロードしないと、画像フィールドは無効になります。私は、フォームの最後にあるif文がうまくいくと思ったが、そうではなかった。ここでは、フォームのforms.pyです:ModelFormが空の場合はimageFieldを無効にします

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

はその後、テンプレートでのようなものを置きますか? –

+0

Product.imageがNoneの場合:form.fields ['image']。disabled =フォーム内のTrueを選択すると、イメージなしのイメージフィールドが無効になっています。ユーザーがイメージをアップロードしていない場合は、そのフィールドを無効にします。 – Steve

答えて

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 %} 
+0

「/ products/post_url /にValueError」というエラーがスローされます。 'image'属性に関連付けられているファイルがありません。 - それを修正する方法がわからない。 また、アップロードしてローカルで使用するのではなく、画像をウェブから取得するときにimage_urlが必要です。 – Steve

+0

スクラッチ - 私は "if"ステートメントを変更して、今動作します。 – Steve

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は、models.ImageField()を割り当てているため、Productクラスの属性を返します(Noneではありません)。 Productを参照すると、ModelForm().instanceから得ることができます。

+0

ありがとうございましたJen - 特に(なぜ意味があるのか​​)説明するために - それは本当に私が学ぶように役立ちます。しかし、これはうまくいかず、デフォルトの画像はまだ表示されています。おそらくフィールドを無効にすることは、それを機能させる方法ではありませんか?他に何ができるかわからない。 – Steve

+0

イメージを表示してフィールドを無効にする方法は2通りあります...フォームを表示するために使用しているテンプレートを共有できますか? –

+0

投稿に使用している{%if%}ステートメントを追加しました。あなたがもっと見る必要がある場合は私に教えてください。また、私は物事を混ぜている場合は事前にお詫び申し上げます - DjangoとPythonにはまだまだ新しいものです。 – Steve

関連する問題