#django #django-forms
#django #django-forms
Вопрос:
Здравствуйте, я разрабатываю систему регистрации для спортсменов для регистрации на спортивные соревнования. Страница регистрации фиксирует всю информацию о спортсмене и сохраняет ее в базе данных в модели «спортсмен». Затем адрес электронной почты спортсменов (который является уникальным полем в модели) сохраняется как переменная сеанса, и пользователь перенаправляется на страницу оплаты. Страница оплаты получит информацию о событии из аргументов, переданных на страницу, а затем извлекет адрес электронной почты спортсмена из переменной сеанса и использует это для получения информации о спортсмене. Оттуда он запрашивает базу данных, используя информацию о спортсмене и событии, чтобы найти стоимость и представить ее пользователю в качестве регистрационного взноса.
Кажется, что со страницей регистрации все в порядке, однако я получаю ошибку «аргумент типа ‘Event’ не подлежит повторению» при перенаправлении на страницу платежей со страницы регистрации.
Вот представление страницы платежей.
def payment(request, event_year, event_slug):
event = Event.objects.get(event_date__year = event_year, event_slug = event_slug)
athlete = Athlete.objects.get(email_address=request.session.get('user_email'))
if request.method == 'POST':
form = PaymentForm(data=request.POST)
if form.is_valid():
# process form payment data
form.save()
return redirect('home')
else:
form = PaymentForm(event, athlete)
return render(request, 'events/event_payment.html', {
'event': event,
'athlete': athlete,
'form': form
})
Форма оплаты и форма регистрации являются обычными формами, а не формами модели. Вот шаблон для формы оплаты. Следует отметить, что если тег {{ form }} удален из шаблона, то страница отображается без ошибок, однако мне нужна {{ form }} для обработки платежа.
{% extends "base.html" %}
{% block head %}
<title>{{ event.event_date.year }} {{ event.event_name }} Payment</title>
{% endblock head %}
{% block content %}
<div class="row-fluid">
<div class="span12">
<h2>{{ event.event_date.year }} {{ event.event_name }} Entry Form for {{ athlete.first_name }} {{ athlete.last_name }}</h2>
<form action="" method="post">
{% csrf_token %}
<p>Payment for {{ athlete.first_name }} {{ athlete.last_name }}
{{ form }}
<button type="submit">Register</button>
</form>
</div>
</div>
{% endblock content %}
Для завершения вот соответствующие части страницы регистрации, хотя я не думаю, что это имеет значение:
def register(request, event_year, event_slug):
event = Event.objects.get(
event_slug = event_slug,
event_date__year = event_year
)
if not event:
raise Http404
if request.method == 'POST':
form = EntryForm(data=request.POST, event=event)
if form.is_valid():
from django.core.exceptions import ObjectDoesNotExist
try:
athlete = Athlete.objects.get(email_address=form.cleaned_data['email_address'])
athlete.first_name = form.cleaned_data['first_name']
athlete.last_name = form.cleaned_data['last_name']
except ObjectDoesNotExist:
# code to create new athlete object
request.session['user_email'] = athlete.email_address
return redirect('payment', event_slug=event_slug, event_year=event_year)
else:
form = EntryForm(request.POST)
return render(request, 'events/event_register.html', {'form': form})
return render(request, 'events/event_register.html', {
'event': event,
'form': form
})
Вот полная обратная трассировка:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/2014/bikini-figure-fitness-physique-championships/payment
Django Version: 1.5.1
Python Version: 2.7.6
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'events')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Template error:
In template /home/nse/Development/Django/cbbf/events/templates/events/event_payment.html, error at line 17
argument of type 'Event' is not iterable
7 : {% block content %}
8 :
9 : <!-- Example row of columns -->
10 : <div class="row-fluid">
11 : <div class="span12">
12 : <h2>{{ event.event_date.year }} {{ event.event_name }} Entry Form for {{ athlete.first_name }} {{ athlete.last_name }}</h2>
13 : <p></p>
14 : <form action="" method="post">
15 : {% csrf_token %}
16 : <p>Payment for {{ athlete.first_name }} {{ athlete.last_name }}
17 : {{ form }}
18 : <button type="submit">Register</button>
19 : </form>
20 : </div>
21 : </div>
22 :
23 : {% endblock content %}
24 :
Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
115. response = callback(request, *callback_args, **callback_kwargs)
File "/home/nse/Development/Django/cbbf/events/views.py" in payment
164. 'form': form
File "/usr/local/lib/python2.7/dist-packages/django/shortcuts/__init__.py" in render
53. return HttpResponse(loader.render_to_string(*args, **kwargs),
File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py" in render_to_string
177. return t.render(context_instance)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
140. return self._render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render
134. return self.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
830. bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
74. return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render
124. return compiled_parent._render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render
134. return self.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
830. bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
74. return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render
63. result = block.nodelist.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
830. bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node
74. return node.render(context)
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render
87. output = force_text(output)
File "/usr/local/lib/python2.7/dist-packages/django/utils/encoding.py" in force_text
99. s = s.__unicode__()
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in __str__
100. return self.as_table()
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in as_table
222. errors_on_separate_row = False)
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in _html_output
145. top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in non_field_errors
248. return self.errors.get(NON_FIELD_ERRORS, self.error_class())
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in _get_errors
117. self.full_clean()
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in full_clean
272. self._clean_fields()
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in _clean_fields
281. value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "/usr/local/lib/python2.7/dist-packages/django/forms/widgets.py" in value_from_datadict
522. if name not in data:
Exception Type: TypeError at /2014/bikini-figure-fitness-physique-championships/payment
Exception Value: argument of type 'Event' is not iterable
Комментарии:
1. Можете ли вы опубликовать полную обратную трассировку?
2. Да, я добавил полную обратную трассировку
3. Я думаю, что ваша проблема в PaymentForm (событие, спортсмен)… Вы переопределили init , чтобы приспособиться к передаче ему события и спортсмена?
4. Спасибо, Марио, вы правы. Я пытался передать аргументы в форму, когда это было не нужно. Аргументы нужно было только передать в представление. Пожалуйста, отправьте ответ, чтобы я мог отдать вам должное.