Аргумент Django forms типа ‘Event’ не подлежит повторению

#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. Спасибо, Марио, вы правы. Я пытался передать аргументы в форму, когда это было не нужно. Аргументы нужно было только передать в представление. Пожалуйста, отправьте ответ, чтобы я мог отдать вам должное.