如何在 Django 中使用 @ 提及用户

IT技术 javascript django reactjs django-models django-views
2021-05-01 08:22:51

我一直在做一个关于 django 的项目,它与 instagram 和 twitter 非常相似,它需要的功能之一是在文本字段中使用“@”提及用户。我一直在调查我如何在 django 中做到这一点,除了像 django-mentions 这样的库我不明白它是如何工作的,我几乎一无所获,但我也发现使用 react 是可能的,但是我不知道是否可以对几乎完成的 django 项目实施react。这个功能如何工作?我应该使用 react 还是任何 javascript?

模型.py

class Post(models.Model):
    text = models.CharField(max_length=200)
    user = models.ForeignKey(User, related_name='imageuser', on_delete=models.CASCADE, default='username')

views.py(上传视图包含存储帖子的表单以供稍后显示,主视图显示上传的帖子)

def upload(request):

    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.user = request.user
            instance.save()
            return redirect('home')
            print('succesfully uploded')

    else:
        form = PostForm()
        print('didnt upload')
    return render(request, 'home.html', {'form': form})

def main(request):
    contents = Post.objects.all()

    context = {
        "contents": contents,
    }
    print("nice2")
    return render(request, 'home.html', context)

表格.py

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ('text')
        exclude = ['user']

html(上传带有文本的帖子的表单,用户可以在其中键入@mentions)

<form method="post" action="{% url 'upload' %}" enctype="multipart/form-data">        
    {% csrf_token %}
    <input type="text" name="text" placeholder="Add a comment..." required="" id="id_text">
    <button class="submit-button" type="submit">Save</button>
</form>

html(这里是帖子的显示位置)

{% for content in contents %}
    {% if contents %}
        <div class="element"><p>{{ content.text }}</p></div>
    {% endif %}
{% endfor %}

如果您有任何问题,请告诉我,记住任何想法都会有所帮助。

2个回答

我发现那个帖子可以帮助使用martor文本编辑器的想法,但它并不难。

在我的应用程序中,我有一个包含 Profile 模型的帐户应用程序,用于将提及链接 @[user] 重定向到用户的个人资料

模型.py

from django.contrib.auth.models import User
class Profile(models.Model):
  user= models.OneToOneField(User, on_delete=models.CASCADE)

网址.py

path('profile/<str:user>/',views.profile, name='profile'),

视图.py

from . models import Profile
def profile(request,user):
the_user= User.objects.get(username=user)
profile= Profile.objects.get(user=the_user)
return render(request, 'profiles/profile.html',{'profile': profile})

设置.py

MARTOR_MARKDOWN_BASE_MENTION_URL = '/accounts/profile/'

然后编辑器继续与用户提及@[user] /accounts/profile/user

您实际上可以构建您的自定义模板标签来检查您想要的任何字段中@(pattern)并且在自定义标签功能中只有您可以检查用户是否存在如果存在然后做任何你想做的事情(比如创建通知或链接到提到的用户个人资料)

######这样的事情#######

  @register.filter(name='mention', is_safe=True)
  @stringfilter
  def mention(value):
     res = ""
     my_list = value.split()
     for i in my_list:
        if i[0] == '@':
            try:
              stng = i[1:]
              user = User.objects.get(username = stng)
              if user:
                 profile_link = user.userprofile.get_absolute_url()
                 i = f"<a href='{profile_link}'>{i}</a>"

            except User.DoesNotExist:
            print("Could not get the data")

      res = res + i + ' '
    
   return res

但是,为了提高效率,您还可以使用正则表达式来查找模式。现在将名为“mention”的标签添加到您的 HTML 中,不要忘记加载该标签