Проблемы с get_object_or_404 в Django

#python #django

#python #django

Вопрос:

У меня ошибка, из-за которой я, похоже, не могу заставить работать эту часть моего кода. Это выдает мне следующую ошибку: ‘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')
]
  

Комментарии:

1. В Python нет get_object_or_404 (или models , и class Meta не имеет особого значения). Я полагаю, вы имеете в виду Django?

2. Да, я знаю! Извините, должно быть, пропустил это

3. можете ли вы опубликовать полную трассировку стека?

4. нам нужна ошибка целиком, потому что это невозможно, код, который вы нам показываете, вызывает эту ошибку.

5. @OzgurAkcali Я обновил свой пост с помощью трассировки.

Ответ №1:

Вам нужно обновить ваш urls.py или изменить ваш views.py файл, чтобы URL-адрес соответствовал имени функции.

views.py

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

urls.py

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