2017-07-16 3 views
0

モデルのリスト表示と編集ビューの管理ビューに画像を表示する方法はわかっています。ModelFormのパスの代わりに、djangoの新鮮なビューで画像を表示する

しかし、私はエンドユーザー用に作成した別のビューで表示する必要があります - 自分のIDの下に既存の写真や画像をさらにアップロード/削除できるようにする。

これは私が行ったコードの変更です。これは管理者のビューに最適です。私のカスタムビューではありません。

モデル定義:

class Photo(models.Model): 
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE) 
    upload = models.ImageField(upload_to=user_directory_path) 
    stars = models.FloatField(default=0) 

    def __str__(self): 
#  return self.artist.last_name+','+self.artist.first_name 
     return mark_safe('<img src="%s" style="width:100px;" />' % self.upload.url) 

    def image_img(self): 
     if self.upload: 
      return mark_safe('<img src="%s" style="width:100px;"/>' % self.upload.url) 
     else: 
      return '(Sin imagen)' 
    image_img.short_description = 'Thumb' 
    image_img.allow_tags = True 

Views.py:

class PhotosetForm(ModelForm): 
    class Meta: 
     model = Photo 
     fields = ('upload', 'image_img') 
     readonly_fields = ('image_img') 
     exclude = ['artist', 'stars'] 

def photoset_update(request, pk, template_name='portfolios/photoset_form.html'): 
    this_artist = get_object_or_404(Artist, pk=pk) 
    PhotoInlineFormset = inlineformset_factory(Artist, Photo, fields=('upload',)) 
    photoset = PhotoInlineFormset(request.POST or None, request.FILES or None, instance=this_artist) 
    if photoset.is_valid(): 
     photoset.save() 
     return redirect('portfolios:index') 
    return render(request, template_name, {'formset':photoset,}) 

Form.html:

<form method="post" class="form-horizontal artist_form" enctype='multipart/form-data'>{% csrf_token %} 
    <div class="row"> 
     {{ formset.management_form }} 
     {% for photo in formset %} 
     <div class="well"> 
      {{ photo }} 
     </div> 
     {% endfor %} 
    </div> 
    <input type="submit" class="btn btn-primary btn-block" value="Save" /> 
</form> 

はしかし、最終的に私は以下のエラーを取得しています:

from . import views 
File "C:\Users\babya\OneDrive - Hewlett Packard Enterprise\PycharmProjects3x\M 
odelsCompany\djangoproject\portfolios\views.py", line 96, in <module> 
    class PhotosetForm(ModelForm): 
    File "C:\Users\babya\OneDrive - Hewlett Packard Enterprise\PycharmProjects3x\M 
odelsCompany\djangoproject_env\lib\site-packages\django\forms\models.py", line 2 
62, in __new__ 
    raise FieldError(message) 
django.core.exceptions.FieldError: Unknown field(s) (image_img) specified for Ph 
oto 

助けてください...!

+1

あなたは関数を呼び出していますが、Djangoはmodelfieldを探しています(あなたの場合は「アップロード」されます)。私はあなたがそこで何をしたのか分からないが、それは少し古くなっていると私はあなたにそれを助けることができないが、私はあなたが望む場合、私は私の画像を表示する方法を示すcn。 – hansTheFranz

+1

ええ、私はそれを後で見つけました。私はphoto.intanceのアップロードフィールドを使って画像を表示しました。 – athultuttu

+0

ええ、現在の方法は私があなたに見せたいと思う方法です。 – hansTheFranz

答えて

0

テンプレートのフォームビューを以下のように変更しました。組み込みのメソッドを使用する代わりに手動でフィールドをレンダリングし、モデルインスタンスから既存のURLを取得して表示し、編集フィールドも追加します。 models.pyのimage_tagメソッドは、実際には管理ビュー以外のビューでは便利には見えませんでした。私は上記のエラーを防ぐためにビューの錫ModelFormのフィールドリストから削除しました。 adminテンプレートを編集するのではなく、管理ビューでそのように簡単になります。

関連する問題