在 django 中,hashtag 与 url 不匹配

In django, hashtag is not matching with the urls

我的 urls 与主题标签不匹配。它说 404 url 未找到。 这是我的 base.html 标签:

 $(document).ready(function() {
      $("p").each(function(data) {
        var strText = $(this).html();
        console.log('1. strText=', strText);
        var arrElems = strText.match(/#[a-zA-Z0-9]+/g);
        console.log('arrElems=', arrElems);
        $.each(arrElems, function(index, value){
          strText = strText.toString().replace(value, '<a href="/tags/'+value+'">'+value+'</a>');
        });
        console.log('2. strText=', strText);
        $(this).html(strText);
      });
    });

我的 hshtag models.py:

from django.db import models
from blog.models import post

# Create your models here.
class HashTag(models.Model):
    tag = models.CharField(max_length=120)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.tag

    def get_postss(self):
        return post.objects.filter(content__icontains="#" + self.tag)

这是我的标签视图:

from django.shortcuts import render
from django.views import View
from .models import HashTag
# Create your views here.


class HashTagView(View):
    def get(self, request, hashtag, *args, **kwargs):
        obj, created = HashTag.objects.get_or_create(tag=hashtag)
        return render(request, 'hashtags/tag_view.html', {"obj": obj})

我将 url 放入我网站的主要 url 中:

from hashtags.views import HashTagView
from django.urls import path, re_path, include

urlpatterns = [

re_path(r'^tags/(?P<hashtag>.*)/$', HashTagView.as_view(), name='hashtag'),

]

您的实施存在一个问题。 1.浏览器没有发送#part给服务器。因此,如果您的 URL 类似于 /tags/#tag,那么 #tag 将不会发送到服务器。进一步阅读:Why is the hash part of the URL not available on the server side?

由于此行为,您的浏览器将点击 /tags/ url。这就是你的 404 错误的原因。

你可以查看twitter的例子,如果hashtag是#DelhiElectionResults,那么那个hashtag的url就是https://twitter.com/hashtag/DelhiElectionResults.

解决方案: 只需从 url 中删除 # 并使其像:/tags/tag/。在您的 JS 中,您可以使用 value.replace('#', '') 从值中删除 #

$.each(arrElems, function(index, value){
    strText = strText.toString().replace(value, '<a href="/tags/'+value.replace('#', '')+'">'+value+'</a>');
    });