这是我的models.py:
class Post(models.Model):
actualPost = models.CharField(max_length=200)
这是form。py:
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['actualPost']
widgets = { 'actualPost' : forms.Textarea(attrs={'maxlength':200}) }
This is my views.py:
def createPostView(request):
if request.method=='POST':
form = PostForm(request.POST)
if form.is_valid():
stringPost = form.cleaned_data['actualPost'] #I'm assuming stringPost will now be the string version of the users input
findLinks(stringPost)
newPost = Post(actualPost = form.cleaned_data['actualPost'])
所以基本上在视图中,在获得用户输入/发布的字符串版本后,我计划将那个字符串发送给一个叫做findLinks的函数。这是findLinks函数:
def findLinks(postString):
word = ''
totalLength = len(postString)
for i in postString:
if i=='@': #basically, I want anything after an '@' sign to be a link..
#so if the post is "Go to @www.google.com to search for anything"
#I want www.google.com to be a link
indexOfSign = postString.index(i)
while ((indexOfSign != totalLength-1) and (postString[indexOfSign+1] != '')):
word += htmlString[indexOfSign+1]
indexOfSign += 1
return word
函数返回"@"符号之后的单词。现在它返回了@符号后的单词,我该如何安全地将这个单词变成链接,这样当我把文章放到模板中时,当我查看模板时,@符号后的单词就会作为链接出现呢?
我想的一种可能的方法是,在python函数中,基本上返回字符串版本的帖子,除了@符号后面的单词,周围是"one_answers",但这不会起作用,因为出于安全原因,Django将用户输入解释为原始字符串而不是代码,正确吗?
我不想强迫Django将Post解释为代码而不是原始字符串,因为这会导致安全问题。是否有任何方法可以让我安全地采取用户输入并将其保存到数据库和模板中,使"@"符号之后的所有单词都成为链接?
像这样声明一个类方法:
class Post(models.Model):
actualPost = models.CharField(max_length=200)
def get_link(self):
if self.actualPost and '@' in self.actualPost:
return self.actualPost.split('@', 1)[1]
return None
和模板中的
{% for post in post_list %}
{% if post.get_link %}
<a href="/{{ post.get_link }}/">Blah </a>
{% endif %}
{% endfor %}