7

前奏曲:

ImageFieldを表示する最も簡単な方法を次に示します。template.htmlフォームに 10 個のフィールドがあり、それが imageField であるかどうかを確認して別の方法で表示するためだけに、それらすべてを反復処理したくないとします。フォームやウィジェットなどで処理したい。したがって、次のように template.html を残しておきます。

template.html

<table>
    {{ form.as_table }}
</table>

そして、 models.pyimage_tagメソッドを追加します。

class UserProfile(Model):
  photo = ImageField(upload_to=PHOTO_DIRECTORY)
  contacts = TextField(null=True)
  ... others

  def image_tag(self):
    return u'<img src="%s" />' % self.photo.url

  image_tag.short_description = 'Image'
  image_tag.allow_tags = True

フォーム.py :

class UserProfileForm(forms.ModelForm):

  class Meta:
    model = UserProfile
    fields = ('contacts', 'photo', 'image_tag', ...others)

エラーが表示されますが、Unknown field(s) (image_tag) specified for UserProfileこれで十分です。

私もそれを入れようとしましたreadonly_fieldsが、どういうわけか表示されません。list_viewを作成する必要がありますか? はいの場合、それはどこにあるべきですか?

ここで何が恋しいですか?image_tagメソッドがフォームではなくモデルの一部である必要があるのはなぜですか? モデルは、フォームを介してユーザーにデータを提示する方法ではなく、データベース内でデータを保持する方法を記述します。これはフォームの一部である必要がありますね。間違っていたら訂正してください。問題を解決するにはどうすればよいですか? どんな助けでも大歓迎です!

4

4 に答える 4

1
from django.utils.safestring import mark_safe


class ImagePreviewWidget(forms.widgets.FileInput):
    def render(self, name, value, attrs=None, **kwargs):
        input_html = super().render(name, value, attrs=None, **kwargs)
        if value:
            img_html = mark_safe(
                f'<br><br><img src="{value.url}" width="200" />')
            return f'{input_html}{img_html}'
        return input_html

作成と更新に同じフォームを使用する場合は、わずかな変更をお勧めします。if 条件は、値が「更新フォームである」かどうかをチェックするか、そうでない場合は入力フィールドのみを提供します。

于 2021-11-02T07:50:31.383 に答える