11- Step-by-Step Guide: Creating Custom Forms with Django

·

2 min read

Are you looking to create a custom form for your website or application? Look no further than this step-by-step guide on how to create a form using Django. With clear instructions and code examples, you'll be able to create a form and display the results in no time.

Edit our poll detail template ("polls/detail.html") to be:

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
<fieldset>
    <legend><h1>{{ question.question_text }}</h1></legend>
    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
    {% 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.choice_text }}</label><br>
    {% endfor %}
</fieldset>
<input type="submit" value="Vote">
</form>

Now, create a "polls/templates/polls/results.html" template and add the following code to it:

<h1>{{ question.question_text }}</h1>

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

<a href="{% url 'polls:detail' question.id %}">Vote again?</a>

Next, go to "/polls/1/" in your browser and vote in the question. You should see a results page that gets updated each time you vote.

Open the "polls/urls.py" URLconf and change it like so:

from django.urls import path

from . import views

app_name = 'polls'
urlpatterns = [    path('', views.IndexView.as_view(), name='index'),    path('<int:pk>/', views.DetailView.as_view(), name='detail'),    path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),    path('<int:question_id>/vote/', views.vote, name='vote'),]

To use Django's generic views, open the "polls/views.py" file and change it like so:

from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views import generic

from .models import Choice, Question


class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        """Return the last five published questions."""
        return Question.objects.order_by('-pub_date')[:5]


class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'


class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'
def vote(request, 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, 'polls/detail.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('polls:results', args=(question.id,)))

In conclusion, this article provides a step-by-step guide on how to create a custom form using Django for a website or application. It includes clear instructions and code examples, making it easy for readers to follow along and create their own form. Additionally, it suggests using Django's generic views for a more efficient process. Overall, this article is a helpful resource for those looking to create a custom form for their project.

If you find this content helpful, please consider subscribing to my channel for future updates.

Did you find this article valuable?

Support Azad Rasul by becoming a sponsor. Any amount is appreciated!