Django 得到了一个意外的关键字参数 'id_speaker'

Django Got an unexpected keyword argument 'id_speaker'

我有一个显示演讲者姓名列表的模板,它们是 url,我想点击这些 url 并转到演讲者页面,我通过一个唯一的 id 找到演讲者,如下所示“832fc2ca-787f” -484b-b815-f82959607311",问题是我收到错误

get_speaker_by_id() got an unexpected keyword argument 'id_speaker'

我认为问题出在 urls.py 或 speakers.html href 上。我查看了每个相关问题,但无法提交解决方案。

urls.py

url(r'^speakers', views.speakers_list, name='speakers'),
url(r'^speaker/(?P<id_speaker>[0-9a-z\-]+)/$',
    views.get_speaker_by_id, name='get_speaker_by_id_url')

这是显示演讲者姓名列表的模板

speakers.html

{% for speaker in all_speakers_list%}

<div class="container">
  <div class="row">
    <div class="col-sm-6">
        <a href="{% url 'get_speaker_by_id_url' speaker.speaker_id %}">{{ speaker.greek_name }}</a>
    </div>
  </div>
</div>
{% endfor %}

views.py

get_speaker_by_id(request, id_speaker):
    ''' Get speaker info by id '''
    requested_speaker = Speaker.objects.get(speaker_id=id_speaker)
    template = loader.get_template('greekparliament/speaker.html')

    context = {
        'requested_speaker': requested_speaker
    }

    return HttpResponse(template.render(context, request))

models.py

class Speaker(models.Model):
    speaker_id = models.CharField(max_length=200, default='')
    english_name = models.CharField(max_length=200, default='', blank=True)
    image = models.CharField(max_length=200, default='', blank=True)
    email = models.EmailField(max_length=254, default='', blank=True)
    wiki_el = models.URLField(max_length=200, default='', blank=True)
    twitter = models.URLField(max_length=200, default='', blank=True)
    greek_name = models.CharField(max_length=200, default='')
    wiki_en = models.URLField(max_length=200, default='', blank=True)
    website = models.URLField(max_length=200, default='', blank=True)

当我们看到如下错误时

get_speaker_by_id() got an unexpected keyword argument 'id_speaker'

我们可以清楚地看到它正在寻找一个名为 id_speaker.

的参数

从您发布的 views.py 文件的代码中,我可以清楚地看到传递了参数 id_speaker。因此,只有一件事可能会产生该错误,那就是 您已经在 views.py 文件中多次定义函数 get_speaker_by_id()

P.S。 通过以下已实施最佳实践的代码更改函数 get_speaker_by_id() 的代码。

from django.shortcuts import render

...

def get_speaker_by_id(request, id_speaker):
    """
    Get speaker info by id <You should always write doc>
    For example, you can follow numpy guidelines on how to 
    write docs - https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt     

    Parameters
    ----------
    request
        Django request that will come from http

    id_speaker: str
        Id of the speaker

    """
    # I think you should handle `DoesNotExist` error here or it will crash
    # with an Internal Server Error when id_speaker does not exists in db
    requested_speaker = Speaker.objects.get(speaker_id=id_speaker)

    context = {
        'requested_speaker': requested_speaker
    }

    return render(request, "greekparliament/speaker.html", context)