首页 > 解决方案 > Django 中的 get_object_or_404 问题

问题描述

我有一个错误,我似乎无法让我的这部分代码工作。它给了我以下错误“element_id”是此函数的无效关键字参数。

起初,我看到我没有调用正确的模型,我已经改变了它,但它似乎仍然不起作用。

def Input(request, element_id, session_id):
    input_element = get_object_or_404(InputData, pk=element_id)
    voice_service = input_element.service
    session = lookup_or_create_session(voice_service, session_id)


    if request.method == "POST":
        session = get_object_or_404(CallSession, pk=session_id)

        value = 'DTMF input'

        result = UserInput()

        result.session = session

        result.category = input_element.input_category 

        result.save()

        return redirect(request.POST['redirect'])

    session.input_step(input_element)
    context = input_generate_context(input_element, session)

    context['url'] = request.get_full_path(False)

    return render(request, 'input.xml', context, content_type='text/xml')

输入数据模型:

class InputData(VoiceServiceElement): 
    """
        An element that saves user input to a line in the database.
    """

    _urls_name = 'service-development:InputData'


    ask_input_label = models.BooleanField(_('Ask the user to fill something in'), default=True)
    input_voice_label = models.ForeignKey(
        VoiceLabel,
        verbose_name = _('Ask input label'),
        help_text = _('The voice label that is played before the system asks the user to fill in the input'),
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='ask_input_label_input'
    )

    ask_confirmation = models.BooleanField(
        _('Ask the caller to confirm their input'), default=True)
    ask_confirmation_voice_label = models.ForeignKey(
        VoiceLabel,
        verbose_name = _('Ask for confirmation voice label'),
        help_text = _('The voice label that asks the user to confirm their pinput. Example: "Are you satisfied with your recording? Press 1 to confirm, or press 2 to retry."'),
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='confirmation_voice_label_input',
    )
    final_voice_label = models.ForeignKey(
        VoiceLabel,
        verbose_name = _('Final voice label'),
        help_text = _('The voice label that is played when the user has completed the input process. Example: "Thank you for your message! The message has been stored successfully."'),
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='final_voice_label_input',
    )
    input_category = models.ForeignKey(
        UserInputCategory,
        verbose_name = _('Input category'),
        help_text = _('The category under which the input will be stored in the system.'),
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='input_category_input',
    )


    _redirect = models.ForeignKey(
        VoiceServiceElement,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='%(app_label)s_%(class)s_related',
        verbose_name = _('Redirect element'),
        help_text=_("The element to redirect to after the message has been played."))

    class Meta:
        verbose_name = _('Input Element')

    @property
    def redirect(self):
        """
        Returns the actual subclassed object that is redirected to,
        instead of the VoiceServiceElement superclass object (which does
        not have specific fields and methods).
        """
        if self._redirect:
            return VoiceServiceElement.objects.get_subclass(id=self._redirect.id)
        else:
            return None

    def __str__(self):
        return "InputData: " + self.name

    def is_valid(self):
        return len(self.validator()) == 0
    is_valid.boolean = True
    is_valid.short_description = _('Is valid')

    def validator(self):
        errors = []
        errors.extend(super(InputData, self).validator())
        if not self._redirect:
            errors.append(ugettext('Input does not have a redirect element') % self.name)
        return errors

有人可以帮我吗?

编辑:添加了完整的跟踪


2019-04-09T18:22:33.619485+00:00 heroku[router]: at=info method=GET path="/vxml/choice/35/7" host=petrichor-rain-system.herokuapp.com request_id=9c0e24be-31ec-440d-a2df-a38aa734265b fwd="217.123.34.179" dyno=web.1 connect=1ms service=308ms status=200 bytes=2180 protocol=http
2019-04-09T18:22:38.338908+00:00 app[web.1]: Internal Server Error: /vxml/InputData/33/7
2019-04-09T18:22:38.338921+00:00 app[web.1]: Traceback (most recent call last):
2019-04-09T18:22:38.338924+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
2019-04-09T18:22:38.338925+00:00 app[web.1]: response = get_response(request)
2019-04-09T18:22:38.338927+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
2019-04-09T18:22:38.338930+00:00 app[web.1]: response = self.process_exception_by_middleware(e, request)
2019-04-09T18:22:38.338984+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
2019-04-09T18:22:38.338987+00:00 app[web.1]: response = wrapped_callback(request, *callback_args, **callback_kwargs)
2019-04-09T18:22:38.338988+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py", line 485, in __init__
2019-04-09T18:22:38.338990+00:00 app[web.1]: raise TypeError("'%s' is an invalid keyword argument for this function" % kwarg)
2019-04-09T18:22:38.338996+00:00 app[web.1]: TypeError: 'element_id' is an invalid keyword argument for this function
2019-04-09T18:22:38.338997+00:00 app[web.1]: Internal Server Error: /vxml/InputData/33/7
2019-04-09T18:22:38.338998+00:00 app[web.1]: Traceback (most recent call last):
2019-04-09T18:22:38.338999+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
2019-04-09T18:22:38.339000+00:00 app[web.1]: response = get_response(request)
2019-04-09T18:22:38.339001+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
2019-04-09T18:22:38.339002+00:00 app[web.1]: response = self.process_exception_by_middleware(e, request)
2019-04-09T18:22:38.339004+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
2019-04-09T18:22:38.339005+00:00 app[web.1]: response = wrapped_callback(request, *callback_args, **callback_kwargs)
2019-04-09T18:22:38.339006+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py", line 485, in __init__
2019-04-09T18:22:38.339007+00:00 app[web.1]: raise TypeError("'%s' is an invalid keyword argument for this function" % kwarg)
2019-04-09T18:22:38.339008+00:00 app[web.1]: TypeError: 'element_id' is an invalid keyword argument for this function
2019-04-09T18:22:38.339533+00:00 app[web.1]: 10.39.172.94 - - [09/Apr/2019:20:22:38 +0200] "GET /vxml/InputData/33/7 HTTP/1.1" 500 59945 "-" "PostmanRuntime/7.6.1"
2019-04-09T18:22:38.342633+00:00 heroku[router]: at=info method=GET path="/vxml/InputData/33/7" host=petrichor-rain-system.herokuapp.com request_id=a69e1ebe-62b0-4d80-ba4b-b2f0b4bab049 fwd="217.123.34.179" dyno=web.1 connect=1ms service=48ms status=500 bytes=60194 protocol=http

编辑 2:添加 urls.py

from django.conf.urls import url, include

from . import views

app_name= 'service-development'
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^choice/(?P<element_id>[0-9]+)/(?P<session_id>[0-9]+)$', views.choice, name='choice'),
    url(r'^message/(?P<element_id>[0-9]+)/(?P<session_id>[0-9]+)$', views.message_presentation, name='message-presentation'),
    url(r'^start/(?P<voice_service_id>[0-9]+)$', views.voice_service_start, name='voice-service'),
    url(r'^start/(?P<voice_service_id>[0-9]+)/(?P<session_id>[0-9]+)$', views.voice_service_start, name='voice-service'),
    url(r'^user/register/(?P<session_id>[0-9]+)$', views.KasaDakaUserRegistration.as_view(), name = 'user-registration'),
    url(r'^language_select/(?P<session_id>[0-9]+)$', views.LanguageSelection.as_view(), name = 'language-selection'),
    url(r'^record/(?P<element_id>[0-9]+)/(?P<session_id>[0-9]+)$', views.record, name='record'),
    url(r'^InputData/(?P<element_id>[0-9]+)/(?P<session_id>[0-9]+)$', views.InputData, name='InputData')
]

标签: pythondjango

解决方案


您需要更新urls.py或更改views.py文件,以使 url 与函数名称匹配。

视图.py

def Input(request, element_id, session_id):
   ...

网址.py

app_name= 'service-development'
urlpatterns = [
    ...
    url(r'^InputData/(?P<element_id>[0-9]+)/(?P<session_id>[0-9]+)$', views.Input, name='Input')
]

推荐阅读