在django的全新视图中,在ModelForm中显示图像而不是路径

时间:2017-07-16 18:55:00

标签: python django views imagefield

我知道在管理员视图中显示图片的方式,以获取模型的列表显示和编辑视图。

但是,我需要将图片显示在我为最终用户创建的不同视图中 - 以便能够上传更多/删除其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

请帮忙..!

2 个答案:

答案 0 :(得分:0)

我在模板中更改了表单视图,如下所示。手动渲染字段,而不是使用内置方法,并从模型实例中检索现有URL以显示它,并同时添加编辑字段。 models.py中的image_tag方法在管理视图以外的视图中看起来并不常用。我从视图中的字段列表中删除了它,以防止出现上述错误。在管理视图中更容易,而不是编辑管理模板。

<form method="post" class="form-horizontal artist_form" enctype='multipart/form-data'>{% csrf_token %}
    <div class="row">
        {{ formset.management_form }}
            {% for photo in formset %}
            {{ photo.id }}
            <div class="col-sm-3 edit-thumbnail">
                <div class="edit-pic">
                    {% if photo.instance.upload %}
                        <a href="{{ photo.instance.upload.url }}" target="new">
                            <img class="edit-face" src="{{ photo.instance.upload.url }}" />
                        </a>
                    {% else %}
                        <div class="img-placeholder">
                            <span class="glyphicon glyphicon-cloud-upload"></span>
                            <p>Add Image</p>
                        </div>
                    {% endif %}
                </div>
                {% render_field photo.upload class+="form-control" placeholder="Photo" %}
                <div class="btn-group btn-group-justified" role="group" data-toggle="buttons">
                    <label class="btn btn-danger" disabled="disabled">
                        <span class="del-checkbox glyphicon glyphicon-trash"></span>
                    </label>
                    <label class="btn-checkbox btn btn-primary">
                        {% render_field photo.DELETE %}Delete
                    </label>
                </div>
            </div>  
        {% endfor %} 
    </div>
    <input type="submit" class="btn btn-primary btn-block" value="Save" />
</form>    

答案 1 :(得分:0)

您可以使用基于 Django UpdateView 类的视图 (CBV)。然后您可以覆盖 get_context_object 属性来命名您的文件对象。然后在模板中,您可以通过命名对象来调用对象,并将其显示在 HTML img 标记中。仅供参考:如果你不命名它对象名称将只是“对象”

当您使用表单集调用模板中的表单时

{{ form.file.label_tag }}
{{ form.file }}
{{ form.file.errors }}

您可以只调用您在 get_context_object 中设置的对象名称并以此方式使用它。这是我执行此操作的表单示例。

Views.py-> UpdateView

class FileUpdateView(UpdateView):
    model = SomeModel
    form_class = SomeForm
    template_name = 'some-template.html'
    context_object_name = 'image'

Forms.py

{{ form.file.label_tag }}
#  Here is where you call the object url
<img src="{{ image.file.url }}" height="200"/><br/>
{{ form.file }}
{{ form.file.errors }}

这将是实现它的方式,而不是绕过它。