/ / Ajouter un formulaire «Photo» à mon formulaire pour permettre aux utilisateurs d'ajouter une photo - django, django-forms, django-models

Ajouter le formulaire «Photo» à mon formulaire pour permettre aux utilisateurs d'ajouter une photo - django, django-forms, django-models

Je voudrais ajouter Imageform à mon formulaire pour permettre à tous les utilisateurs d'ajouter une photo. J'ai lu ça https://docs.djangoproject.com/en/dev/ref/forms/fields/#imagefield et ça https://docs.djangoproject.com/en/dev/ref/forms/api/#binding-uploaded-files

mais je ne sais toujours pas comment y parvenir. Comment puis-je changer mes codes pour permettre aux utilisateurs d'ajouter une photo à partir de leurs propres dossiers? Voici mes codes et j'ai également joint le formulaire idéal que je souhaite créer.

[Ma forme idéale]

Ma forme idéale

models.py

from django.db import models
from django.forms import ModelForm

class Sell(models.Model):
subject = models.CharField(max_length=100)
price = models.CharField(max_length=100)
condition = models.CharField(max_length=100)
photo = models.ImageField(upload_to="media")
email = models.EmailField()
body = models.CharField(max_length=200)

forms.py

from django.forms import ModelForm
from uasite1.models import Sell

class SellForm(ModelForm):
class Meta:
model = Sell

views.py

from django.shortcuts import render_to_response,get_object_or_404
from django.http import HttpResponseRedirect
from uasite1.forms import SellForm
from uasite1.models import Sell
from django.template import RequestContext

def sell_create(request):
context = {}
if request.method == "POST":
form = SellForm(request.POST)
if form.is_valid():
new_sell = form.save()
return HttpResponseRedirect("/sechand/%d/" % new_sell.pk)
else:
form = SellForm()
context["form"] = form
return render_to_response("sell.html",context,context_instance = RequestContext(request))

sell.html

{% extends "base.html" %}
{% block extrahead %}
{% endblock %}
{% block content %}

<form enctype="multipart/form-data" action = "/sechand/" method = "post">
{% csrf_token %}
{{ form.as_p }}

<input type = "submit" value="Submit" />
</form>

{% endblock%}

sell_display.html (c'est le modèle où les informations soumises devraient apparaître.)

{% extends "base.html" %}
{% block content %}
<div id = "sell">

<h3> Product Name : [ {{ sell.subject }}]</h3>
<p>Photo{{ sell.photo }}</p>
<p>Price: [ {{ sell.price }} ]</p>
<p>Condition: [ {{ sell.condition }} ]</p>
<p>Comments: [ {{sell.body}} ]</p>
<p>Contact Email:[ {{ sell.email }} ]</p>
</div>
{% endblock %}

urls.py

from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.conf import settings
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns("",
url(r"^sechand/$","uasite1.views.sell_create"),
url(r"^sechand/(?P<pk>d+)/$", "uasite1.views.sell_detail"),
url(r"^products/electronics/$", "uasite1.views.Electronics"),
url(r"^products/$", "uasite1.views.ProductsAll"),
url(r"^admin/", include(admin.site.urls)),
)+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Réponses:

0 pour la réponse № 1

Je n'ai pas parcouru tout votre code mais je peux remarquer 1 erreur importante, la vue devrait avoir ce qui suit:

form = SellForm(request.POST, request.FILES)

En outre, cette ligne:

<p>Photo{{ sell.photo }}</p>

Je ne pense pas que c'est la façon de montrer une photo, je mettrais un lien vers la photo en faisant:

<p>Photo{{ sell.photo.url }}</p>

Et enfin, pour les environnements de développement, vous souhaiterez peut-être servir des fichiers multimédias, alors ajoutez simplement cette ligne à votre fichier urls.py principal:

from django.conf.urls.static import static
from django.conf import settings

urlpatterns = patterns("",
# your url patterns in here

) + statique (settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

édition:

Servir des fichiers multimédias. Ce lien devrait vous donner un bon aperçu, c'est déroutant je sais, donc je vais vous donner un exemple, tout comme je le fais dans mes projets. D'abord la façon dont je le fais dans settings.py:

#settings.py
from os.path import dirname, join, realpath
# have in mind that I have settings.py under project_root/project/settings.py
# so you probably want to check your path to your project root folder first
ROOT_DIR = realpath(join(dirname(__file__), ".."))
MEDIA_ROOT = realpath(join(ROOT_DIR, "media"))
MEDIA_URL = "/media/"
STATIC_URL = "/static/"
STATICFILES_DIRS = (
join(ROOT_DIR, "static"),
)

C'est comme ça que je le fais, vous pouvez trouver de nombreuses façons qui fonctionnent aussi. Pour vous donner un meilleur indice, mes dossiers ressemblent à ceci:

project_root/
media/
static/
project/
settings.py