TypeError show_poll() 得到了一个意外的关键字参数 's'

TypeError show_poll() got an unexpected keyword argument 's'

我试图在向投票列表提交表单后重定向用户。提交后表单保存在管理员中,但重定向失败任何人都可以帮助我吗?

我的views.py:

def show_poll(request, id):

  p = Poll.objects.get(id=id)
  pops = p.option_set.all()
  context = {
    'poll': p,
    'options': pops,
  }
  return render(request, "show_poll.html", context)

def create_poll(request):

  c_form = PollForm(request.POST or None)
  data = {}
  data["create_form"] = c_form
  if c_form.is_valid():
    poll = c_form.save(commit=False)
    poll.slug = slugify(poll.title)
    poll.save()
    return redirect("show_poll", s=poll.slug)
  return render(request, "create_poll.html", context=data)

我的urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('show/poll/<int:id>/', views.show_poll, name="show_polls"),
    path('c_poll/<slug:s>/',views.show_poll, name="show_poll"),
    path('create/poll/',views.create_poll)
]

您有两条路径引用 相同 视图,确实:

path('show/poll/<b><int:id></b>/', views.<b>show_poll</b>, name='show_polls'),
path('c_poll/<b><slug:s></b>/',views.<b>show_poll</b>, name='show_poll'),

这意味着 show_poll 可以被第一个或第二个模式调用。如果是第一个,它将用 id 调用它,而不用 s.

如果第二个模式“触发”,那么它会用 s=… 子弹来计算 show_poll

您或许可以将两者结合起来并使用:

from django.shortcuts import get_object_or_404

def show_poll(request, <b>id=None, s=None</b>):
    qs = Poll.objects.all()
    if <b>id is not None</b>:
        qs = qs.filter(<b>pk=id</b>)
    if <b>s is not None</b>:
        qs = qs.filter(<b>slug=s</b>)
    p = get_object_or_404(qs)
    pops = p.option_set.all()
    context = {
        'poll': p,
        'options': pops,
    }
    return render(request, "show_poll.html", context)

另一种选择是制作两个单独的视图,一个用于第一个模式,一个用于另一个模式。