首页 > 解决方案 > 为什么我的 form.py 的上下文没有出现?

问题描述

我遇到同样的问题已经有一段时间了,并且一直在尝试不同的解决方案,但没有任何效果。我在网站上看到了不同的示例,但其中大多数都是针对旧版本的 Django。我已经尝试过这样的解决方案,但没有任何效果。问题如题所示,

" 在模板中使用了 {% csrf_token %},但上下文没有提供值。这通常是由于未使用 RequestContext 造成的。"

我试图添加RequestContext(request)到我的代码而不是编写{'form': 'form'},但它没有成功。我曾尝试在我的网址视图中使用HttpResponse()而不是render_to_response,但也没有成功。

在我更改任何内容之前,这是我原来的views.py!

            def ask_page_view(request):
                if request.method == 'POST':
                    form = Ask_Page_Form(request.POST)
                    if form.is_valid():
                        pass  # does nothing, just trigger the validation
                else:
                    form = Ask_Page_Form()
                return render(request, "ask.html",  {'form': form })

这是我添加后的views.pyRequestContext()

        def ask_page_view(request):
            if request.method == 'POST':
                form = Ask_Page_Form(request.POST)
                if form.is_valid():
                    pass
                else:
                    form = Ask_Page_Form()
                return renderto('ask.html', context_instance = RequestContext(request))

这是我正在使用的 forms.py:

        from django import forms

        class Ask_Page_Form(forms.Form):
            name = forms.CharField(
                max_length=30,
                widget=forms.TextInput(
                        attrs={
                                'placeholder': 'Write your name here',
                                'class': 'ask-page-input',
                                'label': 'Student Name'
                            }
            ))
            email = forms.EmailField(
                max_length=254,
                widget=forms.EmailInput(
                        attrs={
                                'placeholder': 'Write your Email here',
                                'class': 'ask-page-input',
                                'label': 'Email'
                            }
            ))
            subject = forms.CharField(
                max_length=50,
                widget = forms.TextInput(
                        attrs={
                                'placeholder': 'Write your Question or Related Subject here',
                                'class': 'ask-page-input',
                                'label': 'Subject'
                            }
            ))

            message = forms.CharField(
                max_length=2000,
                widget=forms.Textarea(
                        attrs={
                                'placeholder': 'Write your message here',
                                'class': 'ask-page-input',
                                'label': 'Message'
                            }
            ))


            source = forms.CharField(       # A hidden input for internal use
                max_length=50,              # tell from which page the user sent the message
                widget=forms.HiddenInput()
            )

            def clean(self):
                cleaned_data = super(Ask_Page_Form, self).clean()
                name = cleaned_data.get('name')
                email = cleaned_data.get('email')
                subject = cleaned_data.get('subject')
                message = cleaned_data.get('message')
                if not name and not email and not subject and not message:
                    raise forms.ValidationError('You have to write something!')

这是 HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Physics Quizzes Ask</title>
  </head>
  <body>
    <form method="POST">
      {% csrf_token %}
      {{ form.as_p }}
    </form>
  </body>
</html>

我希望有四个输入字段,用户可以在其中输入他/她想到的任何问题,然后通过提交按钮将其发送到管理员的电子邮件。但是这些字段没有显示,只有按钮显示。谢谢 :)

标签: djangodjango-formsdjango-templatesdjango-viewsdjango-csrf

解决方案


为了生成表单,您需要调用视图:

html:

<a href="/your_app_name/ask_page_view">create form</a> 
<form method="POST">{% csrf_token %}
  {{ form.as_p }}
  <input type="submit" name="submit">
</form>

your_app 的 urls.py:

url(r'ask_page_view/$', views.ask_page_view),

视图.py:

from django.template.context_processors import csrf

def ask_page_view(request):
    if request.method == 'POST':
       form = Ask_Page_Form(request.POST) 
       if form.is_valid(): # here you validate the created form
          pass  # does nothing, just trigger the validation
       else:
          form = Ask_Page_Form() # here you create a new form          

       args = {}
       args.update(csrf(request))
       args['form'] = form
    return render(request, "ask.html", args)

推荐阅读