我需要帮助使用内联表单来解决django错误。我似乎无法弄清楚这一点。如果我在尝试验证之前能够弄清楚如何做到这一点,我可能会强制插入eventID。
当我提交表单时,我收到错误:Hidden field (event): The inline foreign key did not match the parent instance primary key
有没有办法让这段代码有效?
以下代码应该让教师为一个活动注册多个学生。
------ models.py ------------
class Event(models.Model):
title = models.CharField(max_length=200)
description = models.CharField(max_length=200)
time = models.DateTimeField()
duration = models.DecimalField(max_digits=5, decimal_places=2)
location = models.CharField(max_length=200)
# Customer is a parent, teacher, or school
class Customer(models.Model):
event = models.ForeignKey(Event)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
address1 = models.CharField(max_length=60)
address2 = models.CharField(max_length=60, blank=True)
city = models.CharField(max_length=30)
state = models.CharField(max_length=2)
zipcode = models.CharField(max_length=5)
phone_number = models.CharField(max_length=30)
email = models.EmailField()
# A customer can enroll several students for a single event.
class Attendee(models.Model):
event = models.ForeignKey(Event)
sponsor = models.ForeignKey(Customer)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
------ forms.py -----------
class AttendeeForm(forms.ModelForm):
event = forms.IntegerField(required=True, widget=forms.HiddenInput())
class Meta:
model = Attendee
fields = ( 'event', 'last_name', 'first_name', 'gender', 'schoolYr', )
#exclude = ('event', )
#widgets = {
# 'dtgPurchase' : DateTimeWidget(),
#}
def __init__(self, *args, **kwargs):
super(AttendeeForm, self).__init__(*args, **kwargs)
------- viewss.py ----------
def register3(request, event_id):
messages = []
try:
event = get_object_or_404(Event, id=event_id) #Event ID is passed in here.
AttendeeFormSet = inlineformset_factory(Event, Attendee, form=AttendeeForm, extra=1)
#AttendeeFormSet = formset_factory(AttendeeForm)
if request.method == 'POST':
print "POST"
formset = AttendeeFormSet(request.POST, request.FILES, prefix='attendees')
#formset.save(commit=False)
i=0
for form in formset.forms:
print "Form %s " % str(i)
# ?? Is is possible to set the event Here?
if formset.is_valid():
attendees = formset.save_all()
print "Yay!!!"
#return redirect('event_view', event_id=event.id)
else:
print "Invalid formset"
else: # is get method on first step
formset = AttendeeFormSet(instance=event, prefix='attendees')
print "Event: %s " % event
except Event.DoesNotExist:
raise Http404
c = Context({
'messages': messages,
'event' : event,
'attendees': formset,
})
return prepCxt(request, 'register3.html', c)
答案 0 :(得分:22)
您可能还需要在POST处理中传递实例。
formset = AttendeeFormSet(request.POST, request.FILES, prefix='attendees', instance=event)