2012-07-09 10 views
5

Ich brauche Hilfe, um einen Django-Fehler mithilfe von Inlineformularen zu beheben. Ich kann das nicht herausfinden. Ich könnte wahrscheinlich die EventID erzwingen, wenn ich herausfinden könnte, wie das geht, bevor es versucht, zu validieren.Django Inline-Fremdschlüssel stimmt nicht mit dem übergeordneten Primärschlüssel überein

Wenn ich meine Form ich einen Fehler: Hidden field (event): The inline foreign key did not match the parent instance primary key

Gibt es eine Möglichkeit diesen Code Arbeit zu machen?

Der folgende Code soll es einem Lehrer ermöglichen, mehrere Schüler für eine Veranstaltung anzumelden.

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

Antwort

15

Sie müssen möglicherweise auch Instanz in der Nachbearbeitung zu übergeben.

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