【问题标题】:Django form not rendering input fields in templateDjango表单未在模板中呈现输入字段
【发布时间】:2019-02-23 07:08:28
【问题描述】:

在 django 中创建绑定到模型的表单时,它根本不渲染。

我有以下型号:

class Recipe(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
        default=timezone.now)
    url = models.TextField(validators=[URLValidator()], blank = True)
    photo = models.ImageField(upload_to='photos', blank = True)

    def publish(self):
        self.created_date = timezone.now()
        self.save()

def __str__(self):
    return self.title

形式:

class RecipeForm(forms.ModelForm):

    class Meta:
        model = Recipe
        fields = ['title', 'text']

观点:

def recipe_new(request):
    form = RecipeForm()
    return render(request, 'recipe_edit.html', {'form:': form})

模板:

{% extends 'base.html' %}

{% block content %}
  <h1>New recipe</h1>
  <form method="post" class="recipe-form">{% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="save btn btn-default">Save</button>
  </form>
{% endblock %}

但仅呈现标题“新配方”和“保存”按钮。如果我尝试在终端中打印表单变量,它会正确打印出来。但是,对请求的响应始终没有输入字段(无论我使用 form.as_p 还是仅使用表单)。是我错误地将表单传递给模板还是表单本身有误?

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    你写道:

    {<b>'form:'</b>: form}

    请注意键中的粗体冒号 (:)(您将冒号写了两次,一次在键中,一次作为键值分隔符)。结果,您传递了一个名称中带有冒号的变量。更改模板可能会有所帮助,但我强烈建议不要这样做,因为此类字符通常对模板过滤器等具有特定含义。因此我建议仅使用有效的 Python 标识符。

    由于变量的名称是 form:,因此在模板中使用 form 没有任何意义,因为根据 Django 渲染引擎 - 该变量确实 存在,所以它使用渲染引擎的string_if_invalid 设置(默认为空字符串)解决它。

    应该是:

    def recipe_new(request):
        form = RecipeForm()
        return render(request, 'recipe_edit.html', {'form': form})

    【讨论】:

    • 谢谢,我没注意到。这么愚蠢的错误:)
    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 2020-02-05
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多