Django - 用户表单输入并在输入的某个部分创建链接?

时间:2014-06-29 22:47:58

标签: python django hyperlink django-forms user-input

这是我的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的解释为代码而不是原始字符串,因为这会导致安全问题。有没有办法让我安全地接受用户输入并将其保存到数据库和模板中,使所有单词出现在' @'之后。签一个链接?

1 个答案:

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