提交后如何使Django表单字段为空?

问题描述

我已经创建了django订阅表格。提交后,我想在表单下方显示“谢谢”消息,但如果我提交表单,则电子邮件字段仍显示该值。我已经尝试过HttpResponseRedirect('/'),但这样做不会显示“谢谢”消息。

#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',self.subscribed_on)

解决方法

保存表单后,您可以redirect()来代替呈现模板。

要渲染成功消息,您可以使用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)

现在在模板中,您可以像这样呈现消息。

<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>