2012-07-09 14 views
5

Necesito ayuda para superar un error de django utilizando formularios en línea. Parece que no puedo resolver esto. Probablemente podría forzar la inserción del eventID si pudiera encontrar la manera de hacerlo antes de que intente validar.La clave externa en línea de Django no coincide con la clave primaria principal

cuando presente mi forma me da un error: Hidden field (event): The inline foreign key did not match the parent instance primary key

¿Hay alguna manera de hacer este trabajo código?

Se supone que el siguiente código permite que un maestro inscriba a varios estudiantes para un evento.

------ ------------ 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) 

------- ---------- views.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)  

Respuesta

15

Es posible que tenga que pasar ejemplo en el procesamiento posterior también.

formset = AttendeeFormSet(request.POST, request.FILES, prefix='attendees', instance=event) 
Cuestiones relacionadas