【问题标题】:DJANGO not returning context in my html templateDJANGO 没有在我的 html 模板中返回上下文
【发布时间】:2021-07-06 11:34:14
【问题描述】:

为什么这个上下文没有在我的 html 模板中呈现:

 return render(request, 'index.html',{'message_name':name}) 

成功提交我的联系表后,此上下文将打印用户名。这是我的代码:

views.py

@csrf_exempt 
def home_view(request,*args,**kwargs):
    name = None
    if request.method == "POST":
       contact_form = ContactForm(request.POST)
       if contact_form.is_valid():
          
          name = request.POST['name'] 
          email = request.POST['email']
          subject = request.POST['subject']
          message = request.POST['message']
          save_details = Contact(name=name,email=email,subject=subject,message=message)
          save_details.save()
          return HttpResponseRedirect("http://127.0.0.1:8000/")
          return render(request, 'index.html',{'message_name':name}) 
       else:
          print("not submitted")
          
           

    else:
       contact_form = ContactForm()
         

    return render(request, 'index.html',{'form':contact_form})

应用 urls.py

from django.urls import path
from pages import views


urlpatterns = [
    path('', views.home_view, name="home"),
    
]

根 urls.py

from django.contrib import admin
from django.urls import path,include
from pages import urls
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('pages.urls')),
    
]

index.html

            <!--===== CONTACT =====-->
            <section class="contact section" id="contact">
                <h2 class="section-title">Contact</h2>
 {% if message_name %}
                <div class="centerTest">
                     <h1> Thanks {{ message_name }} for your message. We will get back to you very soon</h1>  
                </div>
{% else %} 

                <div class="contact__container bd-grid">
                    <form action="#contact" method = "POST" class="contact__form">
                              
                        {% for error in  form.non_field_errors %}
                          <div class="alert alert-danger" role="alert">
                               {{ error }}
                          </div>
                        {% endfor %}
                        
                        <label>Name:</label>  
                        {{ form.errors.name }}
                        <input type="text" placeholder="Name" name="name" class="contact__input" {% if form.is_bound %}value="{{ form.name.value }} {% endif %}">
                        <label>Email:</label>
                        {{ form.errors.email }}
                        <input type="mail" placeholder="Email" name="email" class="contact__input" {% if form.is_bound %}value="{{ form.email.value }} {% endif %}">
                        <label>Subject:</label>
                        {{ form.errors.subject }}
                        <input type="text" placeholder="optional" name="subject" class="contact__input" {% if form.is_bound %}value="{{ form.subject.value }} {% endif %}">
                        <label>Message:</label>
                        {{ form.errors.message }}
                        <textarea name="message" placeholder="message"  id="" cols="0" rows="10"   class="contact__input" >{% if form.is_bound %}{{ form.message.value }} {% endif %}</textarea>
                         
                        <input type="submit" value="Send" class="contact__button button">
{% endif %}

如果我删除了 HttpResponseRedirect,那么它会在我的 html 模板中显示上下文

但问题是它在刷新时一次又一次地重新提交我的 from。添加 HttpResponseRedirect 后,它停止重新提交表单但不打印上下文。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您不能直接在重定向中传递上下文或在 django 中使用 HttpResponseRedirect。您需要使用会话方法。试试这个:

    @csrf_exempt 
    def home_view(request,*args,**kwargs):
        name = None
        if request.method == "POST":
           contact_form = ContactForm(request.POST)
           if contact_form.is_valid():
              
              name = request.POST['name'] 
              email = request.POST['email']
              subject = request.POST['subject']
              message = request.POST['message']
              save_details = Contact(name=name,email=email,subject=subject,message=message)
              save_details.save()
              request.session['name'] = name
              return redirect(home_view)
           else:
              print("not submitted")
              
               
    
        else:
           contact_form = ContactForm()
             
    
        return render(request, 'index.html',{'form':contact_form})
    

    在您的 index.html 中传递此 {{ request.session.name }} 以显示您的上下文。

    【讨论】:

      【解决方案2】:

      作为一个基本的 Python 概念(也可能是任何其他编程语言),您不能在一个函数中有两个 return 句子,一个在另一个之上,因为第一个会使第二个无法访问。

      例子:

      def say_hello(name, age):
          return f"hello {name}"
          return f"your age is {age}"
      

      如果你执行这个函数,你只会得到“hello john doe”,因为第二个return语句永远不会被执行。

      在你的情况下,如果你保留return HttpResponseRedirect()return render() 将永远不会被执行,因此你永远不会看到上下文。

      如果您想将用户重定向到特定路线,您应该有条件地这样做,以便有机会执行return 或另一个。

      【讨论】:

      • 你能给我举个例子吗?我只需要在重定向后在 html 页面中显示上下文
      • 如何在 djago 的 html 重定向页面中显示上下文?
      • 你不能在一个代码块中有两个返回语句,即任何编码语言的通用法则
      猜你喜欢
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多