【问题标题】:Can`t render django form in the template无法在模板中呈现 django 表单
【发布时间】:2016-12-06 10:33:39
【问题描述】:

阅读doc on django form 后,我尝试构建自己的表单,但表单无法在模板中呈现。我也在 stackoverflow 上遇到过类似的问题,但没有解决方案可以解决我的问题。
我有这个基于模型的简单表格。这是我的代码的 sn-p。
型号:

class Tweet(activity.Activity, models.Model):
    user = models.ForeignKey('auth.User')
    text = models.CharField(max_length=160)
    created_at = models.DateTimeField(auto_now_add=True)
    #...

形式:

class TweetForm(ModelForm):
    #text = forms.CharField(label = 'Tweet', max_length = 100)
    class Meta:
        model = Tweet
        fields = '__all__'

观点:

def user(request, user_name):
    if not request.user.is_authenticated():
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
    form = TweetForm()
    user = get_object_or_404(User, username=user_name)
    feeds = feed_manager.get_user_feed(user.id)
    activities = feeds.get(limit=25)['results']
    activities = enricher.enrich_activities(activities)
    context = {
        'activities': activities,
        'user': user,
        'login_user': request.user,
        'form': form
    }
    return render(request, 'look/user.html', context)

html:

<form action="" method="post">
  {% csrf_token %}
  {{ form }}
<input type="submit" value="Tweet" />

实际上,我可以在 python shell 中渲染表单,所以表单没有任何问题。然而,我发现问题出在这里:

form = TweetForm()
#...
context = {
    'activities': activities,
    'user': user,
    'login_user': request.user,
    'form': form   #see although the form is passed to the context,
}                  #I can`t access variable form in the html
return render(request, 'look/user.html', context)

context 中的键/值对{'form':form} 未正常呈现,这就是{{ form }} 不起作用的原因。但是context 中的任何其他变量都可以正常工作。
这真的让我很困扰,我无法弄清楚为什么上下文不起作用。提前感谢您的任何想法。
附:
我试过这个:

{% if form %} form is true
{% else %} form is false
{% endif %}

在我的 html 模板中,结果是 form is false,这表明 form 变量没有通过上下文传递,或者发生了我无法解释的事情。对此的任何想法将不胜感激。再次感谢。

【问题讨论】:

  • runserver 的运行情况如何?
  • runserver 工作得很好,只是没有呈现表单并且只有一个按钮。

标签: python django django-forms django-templates


【解决方案1】:

我在模板中使用循环呈现了我的表单:

{% for hidden in form.hidden_fields %}
                {{ hidden }}
            {% endfor %}

            {% for field in form.visible_fields %}
                {{ field.errors }}
                {{ field.help_text }}
                {{ field }}
                <br/>
                <br/>
            {% endfor %}

这会在我的项目中正确显示表单。

【讨论】:

  • 问题是虽然我在上下文中添加了表单,但 html 模板中没有 form 变量。
  • @scotthou 嗯。我不确定它可能是什么。我认为您不小心在此处的代码中注释掉了表单字段,但在实际代码中却没有注释掉?
  • \@cmakie21 那是因为我试图创建一个不基于现有模型的表单来查看问题是否与ModelForm有关。原来不是。
【解决方案2】:

我终于发现出了什么问题......而且这很愚蠢。我实际上在另一个函数中渲染了user.html,所以我在方法user 中所做的任何事情都不起作用。在right视图方法中实例化form实例后,TweetForm就渲染成功了。

【讨论】:

    猜你喜欢
    • 2020-02-05
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2021-02-14
    相关资源
    最近更新 更多