2012-03-23 4 views
0

Sorry, wenn dies eine einfache Lösung ist, ich habe 2 Probleme mit meinem inlineformset:Django: Sparen mit „Unique Together“ und Löschen von Objekten über inlineformset verursacht Fehlerseiten

  1. ein ungültiges Objekt wird gespeichert (nicht treffen Sie eine eindeutige zusammen Anforderung) wirft eine Fehlerseite, anstatt die Fehler im Formular anzuzeigen.

    An einem Punkt hatte ich meine Fehler korrekt angezeigt beim Speichern eines ungültigen Objekts, aber wenn ich versuchte, ein gültiges Objekt zu speichern, würde ich eine Fehlermeldung erhalten, dass membership.department null war. Deshalb habe ich das "zum Beispiel in Instanzen" eingefügt, aber jetzt bekomme ich dieses neue Problem, dass beim Speichern eines ungültigen Objekts keine Fehler angezeigt werden.

  2. Ich habe das gleiche Problem beim Löschen eines gültigen Objekts. Das Objekt wird gelöscht, wie es sollte, aber ich bekomme immer noch eine Fehlerseite ...

Ich bin auf verloren.

Wenn ungültige Objekte Speichern erhalte ich:

The Membership could not be created because the data didn't validate. 

Wenn gültige Objekte zu löschen, erhalte ich:

[u'Select a valid choice. That choice is not one of the available choices.'] 

MODELL:

class Membership(models.Model): 
    project = models.ForeignKey(Project) 
    department = models.ForeignKey(Department) 
    employee = models.ForeignKey(Employee) 
    role = models.ManyToManyField(Role, blank=True, null=True) 
    class Meta: 
     unique_together = (("project", "employee",),) 

VIEW.py

def employee_edit(request, employee_id): 
    i = get_object_or_404(Employee, pk=employee_id) 
    MembershipForm = make_membership_form(i) 
    MembershipFormSet = inlineformset_factory(Employee, Membership, exclude='department', extra=1, form=MembershipForm) 
    if request.method == "POST": 
     f = MembershipFormSet(request.POST, instance=i) 
     if f.is_valid(): 
      instances = f.save(commit=False) 
      for instance in instances: 
       instance.department = i.department 
       instance.save() 
      f.save_m2m() 
      return render_to_response('dbtest/edit.html', {'item': i, 'formset': f, }, context_instance=RequestContext(request)) 
    else: 
     f = MembershipFormSet(instance=i) 
    return render_to_response('dbtet/edit.html', {'item': i, 'formset': f, }, context_instance=RequestContext(request)) 

def make_membership_form(i): 
    class MembershipForm(forms.ModelForm): 
     project = forms.ModelChoiceField(queryset=Project.objects.filter(department=i.department)) 
     class Meta: 
      model = Membership 
      exclude = ('department', 'employee') 
      unique_together = (("project", "employee",),) 
    return MembershipForm 

Antwort

1

Die erste Fehlermeldung ist ziemlich einfach.

The Membership could not be created because the data didn't validate. 

Sie speichern das Formset, ohne zuerst zu überprüfen, dass es gültig ist. Sie sollten nur speichern, wenn formset.is_valid() wahr ist. Ein anderer Blick auf my answer to your previous question

+0

so reedited meine Frage, um Ihre vorherige Antwort zu reflektieren, aber ich bekomme immer noch eine Fehlerseite wenn Mitgliedschaft nicht statt Fehler im Forum zu validieren ... – thedeepfield

+0

Ich schlug nicht vor, dass Sie geändert von ein Inline-Modell-Formset zu einem regulären Modell-Formset - nur, dass Sie das Bit aussortieren, auf dem Sie das Formset überprüfen, und es speichern. Welchen Fehler bekommst du jetzt? Beachten Sie, dass 'unique_together = ((" project "," employee "),)' in der Modellform nichts bewirkt - es ist nur eine Option für Modelle. – Alasdair

+0

Wenn Sie es wieder in ein Inline-Modell-Formset ändern, werden die Fehler angezeigt, wenn das Objekt ungültig ist. Es speichert auch ein gültiges Objekt. aber das Löschen eines gültigen Objekts ist immer noch ein Problem für mich. Ich habe meinen Code aktualisiert. – thedeepfield

Verwandte Themen