2017-07-16 3 views
0

Ich kenne die Möglichkeit, Bild in Admin-Ansichten für eine Modellliste anzeigen und Bearbeitungsansicht anzuzeigen.Anzeige Bild anstelle von Pfad in ModelForm in einer neuen Ansicht in Django

Aber ich brauche das Bild in einer anderen Ansicht, die ich für Endbenutzer erstellt habe - um mehr/vorhandene Fotos/Bilder unter seiner ID hochladen zu können.

Dies sind die Codeänderungen, die ich vorgenommen habe. Es funktioniert perfekt für Admin-Ansichten; aber nicht für meine benutzerdefinierten Ansichten.

Modell Definition:

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> 

Aber am Ende bin ich immer die folgenden Fehler:

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 

Bitte helfen ..!

+1

Sie rufen eine Funktion, aber Django sucht nach einem Modellfeld (in Ihrem Fall wäre es "upload"). Ich bin mir nicht sicher, was du da gemacht hast, es scheint ein bisschen veraltet zu sein und ich kann dir nicht helfen, aber ich kann dir zeigen, wie ich meine Bilder zeige, wenn du willst. – hansTheFranz

+1

Ja, ich habe es später herausgefunden. Ich habe das Upload-Feld von Photo.intance benutzt, um das Bild anzuzeigen. – athultuttu

+0

yeah der aktuelle Weg ist der Weg, den ich dir zeigen wollte. – hansTheFranz

Antwort

0

Ich habe die Formularansicht in der Vorlage wie folgt geändert. Manuell gerenderte Felder anstelle der Verwendung von integrierten Methoden und Abrufen der vorhandenen URL aus der Modellinstanz, um sie anzuzeigen und das Bearbeitungsfeld hinzuzufügen. Die image_tag-Methode von models.py erschien in Ansichten außer Admin-Ansichten nicht wirklich nützlich. Ich entfernte es aus den Feldern Liste Zinn ModelForm in Ansichten, um den obigen Fehler zu verhindern. In Admin-Ansichten wird es einfacher, als die Admin-Vorlagen zu bearbeiten.