SilverCyber
SilverCyber

Reputation: 107

How to make Django form field blank after submit?

I've created a django subscription form. I want to show a 'Thank You' message below the form after submitting but if I submit the form, email field is still showing the value. I've tried HttpResponseRedirect('/') but doing so doesn't show 'Thank You' message.

#Views.py

global categories
categories = ['Development','Technology','Science','Lifestyle','Other']


class IndexView(TemplateView):
    model = Post
    template_name = 'blog/index.html'

    def post(self,request,*args,**kwargs):
        context = self.get_context_data()
        if request.method == 'POST':
            form = SubscriberForm(request.POST)
            if context["form"].is_valid():
                context["email"] = request.POST.get('email')
                form.save()
                form = SubscriberForm()
                return render(request, 'blog/index.html', context=context)

            else:
                form = SubscriberForm()

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(IndexView,self).get_context_data(**kwargs)
        # Add in a QuerySet of all the books
        context['post_list'] = Post.objects.all()
        context["categories"] = categories
        form = SubscriberForm(self.request.POST or None)  # instance= None
        context["form"] = form
        return context

#sidebar.html

  <div class="subscribe">
    <form class="" action="" method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <button id="subscribe-button" type="submit" name="button"><i class="fa fa-paper-plane" aria-hidden="true"></i></button>
    </form>
    {% if email %}
    <h6>Thank you for Subscribing!</h6>
    {% endif %}
    <!-- <a href="#"><i class="fa fa-paper-plane" aria-hidden="true"></i></a> -->
  </div>

#models.py

class Subscribe(models.Model):
    email = models.EmailField()
    subscribed_on = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('-subscribed_on',)

    def __str__(self):
        return 'Subscribed by {} on {}'.format(self.email, self.subscribed_on)

#forms.py

class Subscribe(models.Model):
    email = models.EmailField()
    subscribed_on = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('-subscribed_on',)

    def __str__(self):
        return 'Subscribed by {} on {}'.format(self.email, self.subscribed_on)

Upvotes: 0

Views: 765

Answers (1)

Arjun Shahi
Arjun Shahi

Reputation: 7330

Instead of rendering the template you can redirect() after saving the form.

And to render the success message you can use the django messaging framework.

     def post(self,request,*args,**kwargs):
        context = self.get_context_data()
        if request.method == 'POST':
            form = SubscriberForm(request.POST)
            if context["form"].is_valid():
                context["email"] = request.POST.get('email')
                form.save()
                messages.success(request, 'Thank you for subscribing')
                return redirect('/')
                
            else:
                form = SubscriberForm()
            return render(request, 'blog/index.html', context=context)

Now in the template you can render the messages like this.

<div class="subscribe">
    <form class="" action="" method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <button id="subscribe-button" type="submit" name="button"><i class="fa fa-paper-plane" aria-hidden="true"></i></button>
    </form>
    {% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

    <!-- <a href="#"><i class="fa fa-paper-plane" aria-hidden="true"></i></a> -->
  </div>
    

Upvotes: 1

Related Questions