如何在 <slug>django 中以 sitename.com// 的形式调度 URL<slug>?



我正在尝试创建一个网站,其结构如下:

一个包含各种类似链接的主页(如博客(。用户可以点击其中的任何一个,然后进入其中的任意一个(链接将像site.com/slug(。然后同样的事情(这次链接将像site.com/slug/sug(。

个性化_问题.html

<div id="argument_container">
{% for argument in argument%}
<h6 id='{{ argument.argument_faction }}' style="display:none"><a href=" {{question.get_absolute_url}}{{argument.get_absolute_url}} " style="text-decoration: none; color: black">{{ argument.argument_text }}</a>
<br><br>
<button type="button" class="btn btn-outline-success btn-sm"><i class="fa fa-thumbs-o-down" style="padding-right: 3px;"></i>Agree</button>
<button type="button" class="btn btn-outline-danger btn-sm"><i class="fa fa-thumbs-o-up" style="padding-right: 3px;"></i>Disagree and debate</button>
</h6>
{% endfor %}
</div>

urls.py

urlpatterns = [
path('admin/', admin.site.urls),
path('', home_screen_view, name="home"),
path('register/', registration_view, name="register"),
path('logout/', logout_view, name="logout"),
path('login/', login_view, name="login"),
path('account/', account_view, name="account"),
path('<slug:question>', individual_question_view, name="individual_question_view"),
# for testing
path('<slug:argument>', individual_argument_view, name="individual_argument_view"),

型号.py

class Faction(models.Model):
faction_id = models.BigAutoField(primary_key=True)
faction_question = models.ForeignKey(Question, on_delete=models.CASCADE)
faction_name = models.CharField(max_length=30)
def __str__(self):
return self.faction_name
class FactionArgument(models.Model):
argument_id = models.BigAutoField(primary_key=True)
argument_faction = models.ForeignKey(Faction, on_delete=models.CASCADE)
argument_question = models.ForeignKey(Question, on_delete=models.CASCADE, null=True)
argument_slug = models.SlugField(max_length=80, null=True)
argument_text = models.TextField()
user_id = models.ForeignKey(Account, on_delete=models.CASCADE)
datetime = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
return reverse('individual_argument_view', args=[self.argument_slug])  # chances of error
def __str__(self):
return self.argument_text

views.py

def individual_question_view(request, question):
context={}
question = get_object_or_404(Question, question_slug=question)
context["question"] = question

factions = Faction.objects.filter(faction_question = Question.objects.filter(question = question.question).first())
context["faction"] = factions
arguments = FactionArgument.objects.filter(argument_question = Question.objects.filter(question = question.question).first())
context["argument"] = arguments
return render(request, "snippets/individual_question.html", context)

# for testing

def individual_argument_view(request, argument):
return render(request, "snippets/individual_chain.html")

我可以访问(site.com/slug(,但无法确定下一步(site.com/sslug(的url调度。

目前显示此错误:

Page not found (404) Request Method:   GET Request URL:    http://127.0.0.1:8000/question_1/blue2 Using the URLconf defined in Version2.urls, Django tried these URL patterns, in this order:
admin/ [name='home'] register/ [name='register'] logout/ [name='logout'] login/ [name='login'] account/ [name='account'] <slug:question> [name='individual_question_view'] <slug:argument> [name='individual_argument_view'] password_change/done/ [name='password_change_done'] password_change/ [name='password_change'] password_reset/done/ [name='password_reset_done'] reset/<uidb64>/<token>/ [name='password_reset_confirm'] password_reset/ [name='password_reset'] reset/done/ [name='password_reset_complete'] The current path, question_1/blue2, didn’t match any of these.

您需要修改urls.py文件中的端点签名。现在它读取

path('<slug:question>', individual_question_view, name="individual_question_view"),

但这只涵盖了一个鼻涕虫。

path('<slug:question>/<slug:param2>', individual_question_view, name="individual_question_view"),

这将向视图传递2个参数。

接下来,模板中的href参数不能正常工作,这是因为两个单独的url串联在一起,而不是一个带有两个参数的url:

href=" {{question.get_absolute_url}}{{argument.get_absolute_url}} "

应该是:

href="{% url 'individual_question_view' question.question_slug argument.argument_slug %}"

顺便说一句,张贴的urls.py有一个重复的签名,实际上第二个签名不会做任何事情,因为第一个签名会抓住它并停止搜索:

path('<slug:question>', individual_question_view, name="individual_question_view"),
# for testing
path('<slug:argument>', individual_argument_view, name="individual_argument_view"),

更新:答复意见中讨论了后续问题。

最新更新