Dea*_*ean 3 django django-forms
我无法理解为什么在我的应用程序中我收到此错误.由于所有主键都是文本字段是整数.这是我的代码:
forms.py
class EventAttendForm(forms.Form):
talk = forms.ModelChoiceField(queryset=Talk.objects.all())
membersAttended = forms.ModelMultipleChoiceField(queryset=Member.objects.all())
Run Code Online (Sandbox Code Playgroud)
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')
Run Code Online (Sandbox Code Playgroud)
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})
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我会收到这个错误.确切的错误是:
Exception Type: ValueError
Exception Value: invalid literal for int() with base 10: 'redirectTest'
Run Code Online (Sandbox Code Playgroud)
RedirectTest是我用我的表单为add talk创建的一个Talk,用于检查重定向是否正常工作.它所说的代码行引起的问题是ea.save()
提前感谢,
Dean
考虑一下这条线
ea = Event_Attendance(request.POST['talk'], member)
Run Code Online (Sandbox Code Playgroud)
您正在创建模型的实例Event_Attendance.构造函数期望第一个参数是一个实例Talk.相反,你正在为它提供一个字符串,这是谈话的标题.
快速修复是Talk使用匹配的标题查找实例并将其作为参数传递给构造函数.像这样的东西:
talk = Talk.objects.get(title = request.POST['talk'])
ea = Event_Attendance(talk = talk, membersAttended = member)
ea.save()
Run Code Online (Sandbox Code Playgroud)
这可行,但不是最好的方法.首先,DoesNotExist如果Talk找不到给定标题,则第一行总是可以引发a .其次,您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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4554 次 |
| 最近记录: |