#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')
]