【问题标题】:How to make Django form field blank after submit?提交后如何使Django表单字段为空?
【发布时间】:2020-08-13 03:23:47
【问题描述】:

我创建了一个 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',)

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

【问题讨论】:

  • 您好,欢迎来到 SO!提供一个最低限度可重现的示例会很有帮助...是否提供了绝对必要的代码来描述您遇到的问题?

标签: python django django-forms django-views django-templates


【解决方案1】:

您可以在保存表单后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>
    

【讨论】:

  • 它完全符合我的要求。非常感谢阿琼。
猜你喜欢
  • 2014-07-24
  • 2021-11-09
  • 2015-11-04
  • 2014-10-17
  • 2011-08-12
  • 2011-07-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多