django - 如何清理 url 传递的变量数据?

Posted

技术标签:

【中文标题】django - 如何清理 url 传递的变量数据?【英文标题】:django - how can I clean variable data passed by an url? 【发布时间】:2011-11-25 09:23:38 【问题描述】:

当我使用表单时,我使用 Django 表单清理字段数据,但是如何清理通过 URL 传递的变量数据?

例如,我有一个这样的 URL:http://mywebsite.com/tags/my-tag/ 其中 my-tag 是我的变量m 传递给我的views.py 上的一个函数。

我尝试使用 Django 表单来清理数据,但我收到错误消息“'TagForm' object has no attribute 'cleaned_data'”。 我知道 my-form 变量正在到达 views.py 中的 tags 函数,因为我能够在模板上显示它的内容,所以问题可能出在方式上我正在使用表格。

views.py

def tags(request, my-tag):
    tagform = TagForm(request.GET)
    cleaned_dt = tagform.cleaned_data
    form_tag = cleaned_dt['tag']

forms.py

class TagForm(forms.Form):
    tag = forms.CharField()

有什么想法吗?

【问题讨论】:

实际上我需要的是一种清理从 URL 传递的可变数据的方法。如果有其他解决方案,您可以忽略我的示例。 【参考方案1】:

cleaned_data 字典属性会在您在表单上调用 is_valid 方法后出现。

def tags(request, my-tag):
    tagform = TagForm(request.GET)
    if tagform.is_valid():
        cleaned_dt = tagform.cleaned_data
        form_tag = cleaned_dt['tag']
    return render(request, "may_template.html", "form":tagform)

【讨论】:

添加 if tagform.is_valid(): 解决了“TagForm”对象没有属性“cleaned_data”的错误。现在我仍然需要弄清楚如何清理从 url 传递的变量。【参考方案2】:

您正在创建一个带有请求对象的 TagForm,但您没有在我能看到的任何地方为 TagForm 提供 my-tag 的值。

URL 的/my-tag/ 部分不是请求参数。它是 url 的一部分,并且可能以 my-tag 的形式传递给视图函数(您可能希望将其重命名为 my_tag 以更符合 Python 风格)。

编辑

您可以简单地创建一个 dict 对象来初始化为 Form 对象而不是 request.GET。 An example is here.

data = 'tag': my_tag,
    'anotherIfNecessary': 'Hi there'

tagform = TagForm(data)

基本上,用于填充表单对象的字典必须包含表单字段名称到您希望设置的值的映射。

在这种情况下,您有一个名为“tag”的表单字段名称,并希望将其设置为my-tag(您确定变量名中的破折号不会出现语法错误吗?我愿意.. .)。我已经更正了我的示例。

【讨论】:

我认为您没有将 my-tag 变量传递给表单是正确的。现在的问题是如何将它传递给表单? Evan,我尝试了您的代码,并在其下方添加了 form_tag = clean_dt['my_tag'],就像使用常规表单一样,但没有任何内容传递给“form_tag”变量。为了测试我在模板上添加了 form_tag 并且没有显示任何内容。

以上是关于django - 如何清理 url 传递的变量数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在:Django 中通过 URL 传递带空格的变量

将模板变量从 URL 传递到 Django 中的 FormPreview

django url中的NoReverseMatch js变量

如何将 Django 变量传递给 Vue 道具

Django:如何使用模板变量和 url 标签

Django 将变量传递给 URL 标签