Django - 从用户输入中获取并在特定位置创建链接?

0 投票
1 回答
970 浏览
提问于 2025-04-18 11:31

这是我的 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 把帖子当作代码来处理,因为那样会导致安全问题。有没有什么方法可以安全地将用户输入保存到数据库中,并在模板中把所有 '@' 符号后面的单词变成链接呢?

1 个回答

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 %}

撰写回答