【问题标题】:django form not rendering in template. Input fields doesn't shows updjango 表单未在模板中呈现。输入字段不显示
【发布时间】:2017-05-10 18:16:36
【问题描述】:

我无法在我的模板中看到 django 表单。它没有被正确渲染。我已经尝试过解决这个问题,但表格没有出现。在一个新项目中尝试了相同的代码进行测试 - 效果很好,但在这里它不起作用。这个 {{ form.as_p }} 没有显示任何内容,即没有输入字段供我输入详细信息并检查另一部分。提前致谢。

# forms.py

class ContactForm(forms.Form):
    contact_name = forms.CharField(required=True)
    contact_email = forms.EmailField(required=True)
    contact_subject = forms.CharField(required=True)
    content = forms.CharField(
        required=True,
        widget=forms.Textarea
    )`

和:

# views.py

def contact(request):
    form_class = ContactForm

    
    if request.method == 'POST':
        form = form_class(data=request.POST)

        if form.is_valid():
            contact_name = request.POST.get(
                'contact_name'
            , '')
            contact_email = request.POST.get(
                'contact_email'
            , '')
            contact_subject = request.POST.get(
                'contact_subject'
                , '')
            form_content = request.POST.get('content', '')

            # Email the profile with the
            # contact information
            template = get_template('contact_template.txt')
            context = Context({
                'contact_name': contact_name,
                'contact_email': contact_email,
                'contact_subject' : contact_subject,
                'form_content': form_content,
            })
            content = template.render(context)

            email = EmailMessage(
                "New contact form submission",
                content,
                "Your website" +'',
                ['youremail@gmail.com'],
                headers = {'Reply-To': contact_email }
            )
            email.send()
            return redirect('contact')

    return render(request, 'contact.html', {
        'form': form_class,
    })

相同的模板如下所示。

模板

 <section id="contact">
        <div class="container text-center">
            <div class="row text-center">
                <div class="bg-image">
                    <div class="col-md-6 col-md-offset-3 text-center share-text wow animated zoomInDown heading-text">
                        <p class="heading">
                            If you got any questions, please do not hesitate to send us a message.
                        </p>
                    </div>
                </div>
            </div>

                {% block content %}
                <h1>Contact</h1>
                <form role="form" action="" method="post">{% csrf_token %}

                    {{ form.as_p }}
                    
                    <button type="submit">Submit</button>
                </form>
                {% endblock %}
        </div>
    </section>

【问题讨论】:

  • 请添加您的其余视图。即:如果request.method == "GET" 会发生什么?

标签: python django forms django-forms


【解决方案1】:

request.method 不是POST 时,您还没有处理过这种情况。

您的视图应如下所示:

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # form handling logic here
            # ...
            # ... 
            return redirect('some-link')
        else:
            return render(request, 'template.html', dict(form=form))
    else:
      form = ContactForm()
      return render(request, 'template.html', dict(form=form))

【讨论】:

  • 进行这些更改并没有帮助。只有提交按钮的标题联系人可见。其他什么都没有。 @gitblame
【解决方案2】:

您将表单类而不是表单实例传递给模板。

【讨论】:

    【解决方案3】:

    添加一个 else 子句用于在 GET 上生成表单:

    def contact(request):
    
        form_class = ContactForm
    
        if request.method == 'POST':
            form = form_class(data=request.POST)
            # ... more code from above ...
        else:
            form = form_class() # this is important
    
        return render(request, 'contact.html', {
            'form': form,  # NOTE: instead of form_class!!!!
        })
    

    【讨论】:

    • 进行这些更改并没有帮助。只有提交按钮的标题联系人可见。其他什么都没有。 @Udi
    • 再次检查。确保修复对 render() 的调用。检查您的文件名、拼写错误等。在您的上下文中添加一些内容:{'form': form, 'foo': 'BAR'} 并查看您是否可以使用{{foo}}从模板中看到它
    • 不,它没有被渲染。我尝试将 {'foo' : 'bar'} 添加到我的上下文中。我在我的模板中看不到相同的 {{ foo }}。
    • 检查文件名。停止您的服务器,并确保它已从浏览器中停止并重新启动。
    • 我为此创建了一个新的 html 文件。在那里粘贴表格的代码并且相同的工作。我的索引页面上有实际的联系表。它没有在那里渲染。
    猜你喜欢
    • 2019-02-23
    • 1970-01-01
    • 2020-02-05
    • 2011-12-30
    • 2021-04-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多