Один ключ словаря переопределяет другие. Доступ к словарю осуществляется по определению
Я столкнулся со странной проблемой, когда 21 ключ словаря работает правильно. Однако, когда добавляется 22-й ключ, все перестает работать правильно. Обращение к словарю происходит как при определении, так и при немедленном обращении к нему всегда с 22-м ключом (независимо от того, правильный он или нет). Словарь находится внутри функционального представления Django, целью которого является редактирование форм Product и сохранение их в цитате. Ниже приведен шаблон и url, а также представление функции.
{% url 'quote:edit_line_item' pk=quote.pk product_name=item.product_name line_item=item.pk%}
re_path(r'quote/(?P<pk>\d+)/edit-line-item/(?P<product_name>.+)/(?P<line_item>\d+)/$', views.add_to_quote, name = 'edit_line_item')
def add_to_quote(request,*args,**kwargs):
pk = kwargs['pk']
if kwargs.get('line_item') == None:
product_template_form = 'quote/product_template_form.html'
form_dict = {
'FilterProduct':FilterProductForm(request.POST,initial={'quote':pk},user=request.user),
'Product1': Product1Form(request.POST,initial={'quote':pk},
'Product2': Product2Form(request.POST,initial={'quote':pk},
...
'Product21':Product21Form(request.POST,initial={'quote':pk},
}
form = form_dict[request.POST['product_name']]
else:
obj = get_object_or_404(model_dict[kwargs['product_name']],
pk=kwargs['line_item'])
print(f"object {obj}")
print(kwargs)
product_template_form = 'quote/edit_product_form.html'
print("here")
form_dict = {
"FilterProduct": FilterProductForm(request.POST or None,
initial={'quote':kwargs['pk']}, instance = obj,user=request.user),
# "FilterProduct": print("why am I printing?"),
'Product1': Product1Form(request.POST or None,
initial={'quote':kwargs['pk']}, instance = obj),
'Product2': Product2Form(request.POST or None,
initial={'quote':kwargs['pk']}, instance = obj),
...
'Product21': Product21Form(request.POST or None,
initial={'quote':kwargs['pk']}, instance = obj),
}
print("there")
print(kwargs.get('product_name'))
form = form_dict[str(kwargs.get('product_name'))]
...continues from here with logic
return render(request, product_template_form, {'form':form})
Поскольку предоставлен карг line_item
, выполняется оператор else функции. У меня есть операторы печати выше и ниже form_dict
в качестве средства отслеживания ошибки. Ниже показан вывод, когда product_name
является Product1
. Оператор печати there
никогда не выполняется, потому что к form_dict
неправильно обращаются с помощью клавиши FilterProduct
.
object Product1 object (139)
{'pk': '44', 'product_name': 'Product1', 'line_item': '139'}
here
Internal Server Error: /quote/44/edit-line-item/Product1/139/
Traceback (most recent call last):
File "/home/jackson/.venvs/configurator/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/jackson/.venvs/configurator/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/jackson/.venvs/configurator/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/home/jackson/projects/configurator/quote/views.py", line 328, in add_to_quote
"FilterProduct": FilterProductForm(request.POST or None,
TypeError: __init__() got an unexpected keyword argument 'user'
Если я не комментирую ключ FilterProduct
и использую ключ, который в данный момент закомментирован, функция успешно работает, отображая форму Product1 с данными экземпляра. Я могу сказать, что к ключу FilterProduct
все еще обращаются при определении, из следующего вывода:
object Product1 object (139)
{'pk': '44', 'product_name': 'Product1', 'line_item': '139'}
here
why am I printing?
there
Product1
[21/Oct/2021 19:56:58] "GET /quote/44/edit-line-item/Product1/139/ HTTP/1.1" 200 5078
Опять же, если ключ FilterProduct
добавить в ключ form_dict
, то он сразу становится доступным при определении, и я не знаю, почему. Любое понимание было бы очень признательно.