Django-fr

Forum

  • Accueil
  • » Django-fr
  • » Création de l'example polls, sur une même page ou template.

#1 25-06-2016 04:03:48

nolimitech
Membre
Inscription : 11-02-2015
Messages : 14

Création de l'example polls, sur une même page ou template.

Bonjour à vous,

Je me suis amuser avec l'example fournis par Django. L'application 'polls'.

Tout fonctionne très bien. L'example est précis. Malheureusement tous s'affiche sur des pages différentes.
Je me suis demander s'il était possible, d'afficher les Questions par lien <a href..>. Sur la même page.

Lorsque l'on clique sur la Question, Les réponses apparaissent.
Ainsi, qu'un bouton vote.

Lorsque la personne vote, les résultats s'affichent.

Que ce soit séparément ou tous les Questions ensembles.
C'est pas grave, dû moment que tout est sur la même page.

Après plusieurs tentatives et tellement de recherche de mot clef sur google.
204885MySiteWeb.jpg

J'ai presque réussit, mais il faut que je change manuellement les pages. Surtout le formulaire

Es-ce possible?

Merci de m'aider ou de m'éclairer.

Dernière modification par nolimitech (25-06-2016 04:04:34)

Hors ligne

#2 26-06-2016 04:20:53

nolimitech
Membre
Inscription : 11-02-2015
Messages : 14

Re : Création de l'example polls, sur une même page ou template.

Bonjour à vous,

Voici quelques modifications, de l'application 'polls'.
J'ai ajouté des commentaires, là où  est le problème.

J'ai donc créer une application nommé 'quests' pour questions.

./manage startapp quests

quests/views.py

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
from django.utils import timezone
from django.views import generic
from .models import Choice, Question

class IndexView(generic.ListView):
    #template_name = "quests/index.html"
    context_object_name = "latest_question_list"
    template_name = "quests/test123.html"

    def get_queryset(self):
        return Question.objects.filter(
            pub_date__lte=timezone.now()
            ).order_by('-pub_date')[:5]
class DetailView(generic.DetailView):
    model = Question
    #template_name = "quests/detail.html"
    template_name = "quests/test123.html" 

    def get_queryset(self):
        """Exclude any question that arent published yet"""
        return Question.objects.filter(pub_date__lte=timezone.now())

class ResultsView(generic.DetailView):
    model = Question
    #template_name = "quests/results.html"
    template_name = "quests/test123.html"


#Ici c'est la redirection de la 'question_id' vers un numéro de page.
#Mais, comment afficher des questions sans changer de page.
#Je suis perdu.

def vote(request, question_id): #J'ai essayé en enlevant 'question_id'
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'quests/test123.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('quests:results', args=(question.id,)))

quests/urls.py

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

app_name = 'quests'
urlpatterns = [
    #url(r'^$', views.test123)
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), #Ici pas le choix de tout modifier manuellement. ( 127.0.0.1:8000/quests/id/vote )
    #Comment tout mettre dans la même page. Si l'ID est la page.
]

quests/models.py

from django.db import models
import datetime
from django.utils import timezone
# Create your models here.

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

class Choice(models.Model):
    question = models.ForeignKey(Question)
    choice_test = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_test

Je sais que dans <form></form>,j'obtiens une erreur dans {% url 'quests:vote' question.id %}
Parce que dans le views.py  la fonction 'vote' prend question_id comme paramètre.

J'essaie de modifier views.py et et jouer avec l'url de la <form> du template.

J'ai aussi créer un autre template, avec uniquement le <form> et j'ai {% extends "test123.html" %}
Je croyais que avoir une parti du problème, mais non.
Je suis Perdu

quests/templates/test123.html

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

        <p>Tous les Questions</p>
        {% if latest_question_list %}
            <ul>
                {% for question in latest_question_list %}
                <li><a href="{% url 'quests:detail' question.id %}">{{ question.question_text }}</a></li>
                {% endfor %}
            </ul>
        {% else %}
            <p>No polls are available.</p>
        {% endif %}

        <p>Vote FORM</p>
        {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

        <form action="{% url 'quests:vote' question.id %}" method="post">
        {% csrf_token %}
        {% for choice in question.choice_set.all %}
            <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
            <label for="choice{{ forloop.counter }}">{{ choice }}</label><br />
        {% endfor %}
        <input type="submit" value="Vote" />
        </form>

        <p>Results votes</p>
        <ul>
            {% for choice in question.choice_set.all %}
                <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
            {% endfor %}
        </ul>

        <a href="">Vote again?</a>

    {% endblock content %}

quests/templates/quests_vote.html

{% extends "test123.html" %}
{% block content %}
    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

    <form action="{% url 'quests:vote' question.id %}" method="post">
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
        <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
        <label for="choice{{ forloop.counter }}">{{ choice }}</label><br />
    {% endfor %}
    <input type="submit" value="Vote" />
    </form>
{% endblock content %}

Suis-je dans la bonne direction?
Es-ce le meilleur moyen?

Lors des recherches, je tombe souvent sur des doubles <form> dans un template, ou encore doubles views dans un template.

J'aimerais simplement poser des questions, avoir un formulaire de vote et le résultat de vote sur la même page.

Quelqu'un pourrait m'aider?
Un lien, un mot-clef, un example..
C'est peut-être même une question de html ( que je connais, lorsqu'il était statique, il y a bien longtemps... )


Merci de votre aide

Dernière modification par nolimitech (26-06-2016 04:22:57)

Hors ligne

  • Accueil
  • » Django-fr
  • » Création de l'example polls, sur une même page ou template.

Pied de page des forums