"Недопустимый литерал для int () с основанием 10:" Но не могу понять, почему он обращается к целому числу - PullRequest
3 голосов
/ 15 августа 2010

Я не понимаю, почему в моем приложении я получаю эту ошибку. Поскольку все первичные ключи являются текстовыми полями, являются целыми числами. Вот мой код:
forms.py

 class EventAttendForm(forms.Form):
     talk = forms.ModelChoiceField(queryset=Talk.objects.all())
     membersAttended = forms.ModelMultipleChoiceField(queryset=Member.objects.all())

models.py

 class Talk(models.Model):
     title = models.CharField(max_length=200, primary_key=True)  
 class Member(models.Model):
     name = models.CharField(max_length=200)
     membership_number = models.CharField(max_length=200, primary_key=True)
     talks = models.ManyToManyField(Talk, through='Event_Attendance')
 class Event_Attendance(models.Model):
     talk = models.ForeignKey('Talk')
     membersAttended = models.ForeignKey('Member')

views.py

 def addAttendance(request):
     #eventAttendanceForm
     if request.method == 'POST':
          eventAttendForm = EventAttendForm(request.POST)
      for member in request.POST['membersAttended']:
            ea = Event_Attendance(request.POST['talk'], member)
            ea.save()
    return HttpResponseRedirect('../../../talks/')      
else:
    eventAttendForm = EventAttendForm()
    return render_to_response('attendance/addAttendance.html',{'eventAttendForm': eventAttendForm})

Я не понимаю, почему я получаю эту ошибку. Точная ошибка:

 Exception Type:    ValueError
 Exception Value:   invalid literal for int() with base 10: 'redirectTest'

RedirectTest - это Talk, который я создал вместе с формой для добавления, чтобы проверить, что перенаправление работает правильно Строка кода, вызываемая этой проблемой: ea.save()
Заранее спасибо,
Декан

1 Ответ

5 голосов
/ 15 августа 2010

Рассмотрим строку

ea = Event_Attendance(request.POST['talk'], member)

Вы создаете экземпляр модели Event_Attendance. Конструктор ожидает, что первый аргумент будет экземпляром Talk. Вместо этого вы предоставляете ему строку, которая является заголовком доклада .

Быстрое решение проблемы - поиск экземпляра Talk с соответствующим заголовком и передача его в качестве аргумента конструктору. Примерно так:

talk = Talk.objects.get(title = request.POST['talk'])
ea = Event_Attendance(talk = talk, membersAttended = member)
ea.save()

Это будет работать, но это не лучший способ сделать это. Например, первая строка всегда может поднять DoesNotExist, если Talk с данным заголовком не найден. Во-вторых, вы обращаетесь к POST переменным напрямую, а не используете Form для их проверки.

Поэтому лучшим ответом будет:

eventAttendForm = EventAttendForm(request.POST.copy())
if eventAttendForm.is_valid():
    talk = eventAttendForm.cleaned_data['talk']
    membersAttended = eventAttendForm.cleaned_data['membersAttended']

    for member in membersAttended:
        ea = Event_Attendance(talk = talk, membersAttended = member)
        ea.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...