【问题标题】:how do you strip whitespace from entries in django forms?你如何从 django 表单中的条目中去除空格?
【发布时间】:2015-12-04 00:46:25
【问题描述】:

我正在尝试使用 django 表单初始化功能,出于某种原因,网络在高级表单功能上似乎非常简洁。我只是想把“repo-with-accidental-space”之类的错字改成“repo-with-accidental-space”。现在我有:

class BitbucketCreateRepoForm(forms.Form):
    def __init__(self, repo_name=None, *args, **kwargs):
        if repo_name:
            self.repo_name = repo_name.strip()
        super(BitbucketCreateRepoForm, self).__init__()

    username    = forms.ChoiceField(required=True, initial='codyc54321', choices=BITBUCKET_USERNAME_CHOICES)
    repo_name   = forms.CharField(required=True, label='Repo name')
    description = forms.CharField(widget=forms.Textarea, required=False)

表单将在页面上加载,但是当我提交时:

AttributeError at /bitbucket/create-repo
'QueryDict' object has no attribute 'strip'

进入 ipdb 会很麻烦,必须有一个标准的方法来做到这一点,但我不再在我看到它的地方工作了。

这是视图:

def create_repo(request):
    form = BitbucketCreateRepoForm(request.POST or None)
    if form.is_valid():
        repo_name   = request.POST['repo_name']
        username    = request.POST['username']
        description = request.POST['description'] or None            
        create_repo_func(username=username, repo_name=repo_name, description=description)
    return render(request, 'bitbucket/create_repo.html', locals())

仅当表单通过 POST 并更新该字段,在 GET 请求时将其留空时,我如何处理此字段?谢谢

【问题讨论】:

  • 什么不起作用?你有错误吗? .strip() 将删除字符串开头和结尾的空格:docs.python.org/2/library/string.html#string.strip
  • 是的,看来我没有放它们,漫长的一天
  • 我就在你身边 :)
  • 等一下...我看到了一个问题。你正在重新定义repo_name

标签: python django django-forms


【解决方案1】:

实例化此表单时传入请求方法。您可以使用以下命令检查请求方法:

post = request.method == 'POST'

您可以将其传递给下面修改后的__init__

class BitbucketCreateRepoForm(forms.Form):
    def __init__(self, repo_name=None, post=False, *args, **kwargs):
        if repo_name and post:
            self.repo_name = json.dumps(repo_name).strip()
        super(BitbucketCreateRepoForm, self).__init__()

    username    = forms.ChoiceField(required=True, initial='codyc54321', choices=BITBUCKET_USERNAME_CHOICES)
    repo_name   = forms.CharField(required=True, label='Repo name')
    description = forms.CharField(widget=forms.Textarea, required=False)

更新: 当你修改你的问题时,我正在打字。为了获得 QueryDict 对象的字符串表示,只需 import json 然后 json.dumps(repo_name)。希望有帮助。

【讨论】:

  • init 怎么知道 repo_name=None 将成为 repo_name 字段?
  • 我假设您将它作为关键字参数传递,对吗?应该看起来像 form = BitbucketCreateRepoForm(repo_name=your_repo_name, post=post)
  • 我更新了我的答案。注意到我错误地将参数放在类声明中,而不是 __init__
  • 好吧,我对 Django 表单不是很熟悉,但是对于初学者来说,您没有正确调用构造函数。 request.POST or None 只能评估为 TrueFalse,这将成为一个位置参数,并且您没有在 init 函数中处理任何位置参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多