这是我的models.py:
class Post(models.Model):
actualPost = models.CharField(max_length=200)
这是我的forms.py:
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['actualPost']
widgets = { 'actualPost' : forms.Textarea(attrs={'maxlength':200}) }
这是我的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函数中,基本上返回帖子的字符串版本,除了@符号后面的单词""和"",但是这不起作用,因为出于安全原因,Django将用户输入解释为原始字符串而不是代码,对吗?
我不想强迫Django将Post的解释为代码而不是原始字符串,因为这会导致安全问题。有没有办法让我安全地接受用户输入并将其保存到数据库和模板中,使所有单词出现在' @'之后。签一个链接?
答案 0 :(得分:1)
声明一个这样的类方法:
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 %}