我知道在管理员视图中显示图片的方式,以获取模型的列表显示和编辑视图。
但是,我需要将图片显示在我为最终用户创建的不同视图中 - 以便能够上传更多/删除其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
请帮忙..!
答案 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 }}
这将是实现它的方式,而不是绕过它。