News

Piccolo contributo per rinnovo abbonamento hosting: http://www.python-it.org/forum/index.php?topic=10331.0

Topic: Form per caricamento immagini  (Letto 527 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline andreahrc

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Form per caricamento immagini
« il: Febbraio 08, 2017, 16:21 »
Ciao a tutti sono neofita, ho un modello post composto da vari campi testuali e 3 di tipo imagefield, non ho capito per come e dove devo inserire il pulsante per eseguire l'upload del file, scusate so che una domanda banale, volevo inviare screenshot in allegato ma mi dice che la cartella piena

Offline Aezio

  • python neanderthalensis
  • ****
  • Post: 321
  • Punti reputazione: 1
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #1 il: Febbraio 08, 2017, 16:28 »
non farlo.

A) il forum non e' fatto per quello
B) non serve, copia incolla il codice che serve, qualcuno desideroso di autarti potra' copia-incollarsi il codice sulla sua macchina, con un'immagine e' impossibile.

Unica parzialissima eccezione domande GUI-related, in quel caso usa un sito di hosting per immagini

Offline andreahrc

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #2 il: Febbraio 08, 2017, 17:55 »
ok grazie
dunque nel file forms.py ho il seguente codice:

from django import forms

from .models import Post

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ('title','text', 'foto_1','foto_2','foto_3',)

devo intervenire qui per aggiungere il pulsante per l'upload delle immagini?

questo invece la devinizione di post dentro model.py:
class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    foto_1 = models.ImageField(upload_to = 'pic_folder/', default = 'pic_folder/None/no-img.jpg')
    foto_2 = models.ImageField(upload_to = 'pic_folder/', default = 'pic_folder/None/no-img.jpg')
    foto_3 = models.ImageField(upload_to = 'pic_folder/', default = 'pic_folder/None/no-img.jpg')
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

grazie in anticipo

Offline bancaldo

  • python neanderthalensis
  • ****
  • Post: 393
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #3 il: Febbraio 09, 2017, 09:37 »
Il pulsante va inserito nella template.

Qualcosa tipo:

<form action="{% url tua_upload_url %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="submit" class="btn" value="upload_image"
                        name="upload image">
    ....
</form>


dove il pulsante appunto:

 <input type="submit" class="btn" value="upload_image"  name="upload image">



La guida di Django molto esaustiva in merito.
Ciao

Offline andreahrc

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #4 il: Febbraio 12, 2017, 10:46 »
Scusa sono un po arruginito ma mi da errore

TemplateSyntaxError at /post/1/edit/
Invalid block tag: '/foto', expected 'endblock'
Request Method:   GET
Request URL:   http://127.0.0.1:8000/post/1/edit/
Django Version:   1.8
Exception Type:   TemplateSyntaxError
Exception Value:   
Invalid block tag: '/foto', expected 'endblock'

io ho inerito  questo codice
<form action="{% /foto %}" method="post" enctype="multipart/form-data">


ed ho la cartella foto

Offline andreahrc

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #5 il: Febbraio 12, 2017, 10:55 »
ok ho cambiato il codice ma cambiato anche l errore :)

mettendo questo:
<form action="{% url 'post_edit' %}" method="post" enctype="multipart/form-data">{% csrf_token %}


mi da questo errore

Reverse for 'post_edit' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: ['post/(?P<pk>[0-9]+)/edit/$']

Offline bancaldo

  • python neanderthalensis
  • ****
  • Post: 393
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #6 il: Febbraio 12, 2017, 15:18 »
io non conosco il tuo file urls.py...
la url 'post_edit', si aspetta che gli passi l'id del post che vuoi editare:

['post/(?P<pk>[0-9]+)/edit/$']


quindi quando accade il 'Reverse for 'post_edit'' dell'errore, ci si aspetta un argomento id, es:

{% url 'post_edit' post_id=post.id %}

Offline andreahrc

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #7 il: Febbraio 13, 2017, 18:26 »
nel mio urls.py c' questo codice:

from django.conf.urls import url
from . import views


urlpatterns = [
   url(r'^$', views.post_list, name='post_list'),
   url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'),
   url(r'^post/new/$', views.post_new, name='post_new'),
   url(r'^post/(?P<pk>[0-9]+)/edit/$', views.post_edit, name='post_edit'),
   ]


mentre questo views.py


from django.shortcuts import render
from django.utils import timezone
from .models import Post
from django.shortcuts import render, get_object_or_404
from .forms import PostForm
from django.shortcuts import redirect

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
        post = get_object_or_404(Post, pk=pk)
        return render(request, 'blog/post_detail.html', {'post': post})

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('blog.views.post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})

def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('blog.views.post_detail', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'blog/post_edit.html', {'form': form})

Offline bancaldo

  • python neanderthalensis
  • ****
  • Post: 393
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #8 il: Febbraio 13, 2017, 20:28 »
ok ma non so il resto.
Presumo tu abbia una lista di posts servita da una quanche view.
La template legata a quest'ultima come fatta?
Hai degli 'href' su ogni post e quando li clicki ti spedisce sull'edit del post?

Senza vedere le templates   difficile risalire all'errore.


EDIT:

altra cosa che noto che nella view post_edit, non passi l'oggetto post al context (il dizionario):

render(request, 'blog/post_edit.html', {'form': form, 'post': post})


anche la template post_edit.html non conosciamo, difficile cos...
« Ultima modifica: Febbraio 13, 2017, 21:51 da bancaldo »

Offline andreahrc

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #9 il: Febbraio 14, 2017, 16:01 »

Presumo tu abbia una lista di posts servita da una quanche view.
La template legata a quest'ultima come fatta?
Hai degli 'href' su ogni post e quando li clicki ti spedisce sull'edit del post?



Esatto,

ho il file post_list.html cos composto:
{% extends 'blog/base.html' %}

{% block content %}
    {% for post in posts %}
        <div class="post">
            <div class="date">
                {{ post.published_date }}
            </div>
            <h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
            <p>{{ post.text|linebreaksbr }}</p>
        </div>
    {% endfor %}
{% endblock content %}


mentre il file views.py contiene questo:
from django.shortcuts import render
from django.utils import timezone
from .models import Post
from django.shortcuts import render, get_object_or_404
from .forms import PostForm
from django.shortcuts import redirect

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
        post = get_object_or_404(Post, pk=pk)
        return render(request, 'blog/post_detail.html', {'post': post})

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('blog.views.post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})

def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('blog.views.post_detail', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'blog/post_edit.html', {'form': form})

Offline bancaldo

  • python neanderthalensis
  • ****
  • Post: 393
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #10 il: Febbraio 14, 2017, 17:01 »
bene

continui a non passare l'oggetto 'post' alla template post_edit
def post_edit(request, pk):  
    post = get_object_or_404(Post, pk=pk)
    ...
    return render(request, 'blog/post_edit.html', {'form': form, 'post': post})  


ciao

EDIT:
la lista dei post la vedi e hai errore quando cerchi di editarne uno, giusto?
« Ultima modifica: Febbraio 14, 2017, 17:06 da bancaldo »

Offline andreahrc

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #11 il: Febbraio 14, 2017, 17:12 »
Ciao grazie mille per l'aiuto, ho fatto ,le modifiche che mi hai detto ma da questo errore:

Reverse for 'post_edit' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: ['post/(?P<pk>[0-9]+)/edit/$']

1   {% extends 'blog/base.html' %}
2   
3   {% block content %}
4       <h1>New post</h1>
5   <!--    <form method="POST" class="post-form">{% csrf_token %}
6   
            <form action="
      {% url 'post_edit' %}
      " method="post" enctype="multipart/form-data">{% csrf_token %}-->

inoltre non ho capito quando mi dici di passare post.id  non capisco quando stato definito l'elemento post.id

io in models.py ho la seguente definizione di Post (tra l'altro maiuscolo dunque non so se stiamo parlando dello stesso oggetto)

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    foto_1 = models.ImageField(upload_to = 'pic_folder/', default = 'pic_folder/None/no-img.jpg')
    foto_2 = models.ImageField(upload_to = 'pic_folder/', default = 'pic_folder/None/no-img.jpg')
    foto_3 = models.ImageField(upload_to = 'pic_folder/', default = 'pic_folder/None/no-img.jpg')
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

Offline andreahrc

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #12 il: Febbraio 14, 2017, 17:13 »

la lista dei post la vedi e hai errore quando cerchi di editarne uno, giusto?

esatto

Offline bancaldo

  • python neanderthalensis
  • ****
  • Post: 393
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #13 il: Febbraio 14, 2017, 17:27 »
che template l'ultima che hai postato? post_edit.html?

hai corretto la view post_edit?

def post_edit(request, pk):    
    post = get_object_or_404(Post, pk=pk)  
    ...  
    return render(request, 'blog/post_edit.html', {'form': form, 'post': post})  # <-- devi aggiungere l'oggetto post nel dizionario


EDIT:
la template che hai postato un po' incasinata.
La riga 5 un commento.
<!--    <form method="POST" class="post-form">{% csrf_token %} 



posta con il tag codice la template post_edit...
« Ultima modifica: Febbraio 14, 2017, 17:53 da bancaldo »

Offline andreahrc

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re: Form per caricamento immagini
« Risposta #14 il: Febbraio 14, 2017, 18:43 »
Citazione
La riga 5 un commento.

in effetti mi da l'errore proprio sulla riga del commento... possibile che non lo legga come un commento html? dunque come lo devo commentare?

ok te l'ho gi postata per forse mi sono spiegato male, io ho il file post_edit.html in questo percorso templates/blog/post_edit.html e c' il seguente codice

{% extends 'blog/base.html' %}

{% block content %}
    <h1>New post</h1>
<!--    <form method="POST" class="post-form">{% csrf_token %}
      <form action="{% url 'post_edit' %}" method="post" enctype="multipart/form-data">{% csrf_token %}-->
      <form action="{% url 'post_edit'  %}" method="post" enctype="multipart/form-data">{% csrf_token %}   
         <input type="submit" class="btn" value="upload_image" 
                        name="upload image">
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Save</button>
    </form>
{% endblock %}