在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)
...
答案 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)