从表单输入中删除特定字母

时间:2018-08-17 07:17:18

标签: python django django-forms

clean()中,我试图检查用户是否在SearchHashtagForm中包含“#”,如果是,请将其删除。

例如,假设用户在SearchHashtagForm上输入“ #foo”:

已执行'search_text':“ foo”

ACTUAL'search_text':“#foo”

我怀疑form_input = form_input[1:]行不起作用,但是我不确定还要使用什么?

Views.py

class HashtagSearch(FormView):
    """ FormView for user to enter hashtag search query """

    def form_valid(self, form):
        form.clean()
        return super().form_valid(form)

Forms.py

class SearchHashtagForm(ModelForm):
    """ ModelForm for user to search by hashtag """

    def clean(self):
        cleaned_data = self.cleaned_data
        form_input = cleaned_data.get('search_text')
        if form_input.startswith('#'): # if input starts with '#', remove it.
            form_input = form_input[1:]
            cleaned_data['search_text'] = form_input
        return cleaned_data

已解决

为了简洁起见,我省略了以下行:原始查询的self.get_tweets(form)中的form_valid()。我在下面提供了更完整的代码副本以及解决方案:

作为解决方案,我删除了clean(),而在lstrip("#")get_success_url中都加入了get_tweets()(如下文所建议)。

def get_success_url(self):
    return '{}?search_text={}'.format(
        reverse('mapping_twitter:results'),
        self.request.POST.get('search_text').lower().lstrip("#"),
    )

def form_valid(self, form):
    self.get_tweets(form)
    return super().form_valid(form)

def get_tweets(self, form):
    ...
    search_filter = self.request.POST.get('search_text').lower().lstrip("#")
    ...
    tweet_object, created = Hashtag.objects.get_or_create(search_text=search_filter)
    ...

4 个答案:

答案 0 :(得分:1)

您可以使用lstrip()来删除字符串开头的多余字符,如下所示:

>>> tag = "#foo"
>>> tag.lstrip("#")
>>> "foo"

>>> tag = "foo"
>>> tag.lstrip("#")
>>> "foo"

>>> tag = "#foo#bar"
>>> tag.lstrip("#")
>>> "foo#bar"

这还将为您节省额外的方法调用,以检查字符串是否以"#"开头,它隐式处理它,并且如果tag的开头不是所需的{{1 }}。

答案 1 :(得分:1)

如果form_input = form_input [1:]和form_input.startswith('#')不会引发错误,

也许您有一个普通的字符串(否则,为什么切片和.startswith('#')应该起作用),该字符串以您看到的#之前的n个不可见的尾随字符开头。

如果是这样,请尝试:

form_input = form_input[2:]

form_input = form_input[3:]

form_input = form_input[4:]

...

看看您是否得到合理的结果。

(打印form_input并查看结果)

如果这不起作用,则很可能在表单输入中有一些混合数据类型。

获取表单输入的类型和值,并将其添加到您的问题中。

答案 2 :(得分:1)

您也可以尝试以下方法:

''.join(filter(lambda x: x != '#', '#foo'))
# foo

答案 3 :(得分:0)

您可以为此使用正则表达式

import re

class SearchHashtagForm(ModelForm):
""" ModelForm for user to search by hashtag """

def clean(self):
    cleaned_data = self.cleaned_data
    form_input = cleaned_data.get('search_text')
    re.sub('[#]','', form_input)     
    cleaned_data['search_text'] = form_input
    return cleaned_data

这将替换字符串中与“#”匹配的所有字符。由于您可以检查更多字符(例如“%”),因此该解决方案更加可靠。例如

re.sub('[#%]','', form_input)