2016-04-26 3 views
0

Ich habe eine Datenbank von Kunden und Behandlungen, mit jedem Kunden kann mehrere Behandlungen haben. Das Problem ist, dass eine Behandlung ihren Kundenwert in der DB verliert, und statt der ID des Kunden ist der Wert einfach NULL.Django Modell verliert seine Beziehung ForeignKey, während das Formular gespeichert wird

dies geschieht in dem folgenden Code:

def get_treatment(request, treatment_id): 
    customer = Treatment.objects.get(id=treatment_id).customer 
    if request.POST: 
     form = TreatmentForm(request.POST, instance=Treatment.objects.get(id=treatment_id)) 
     if form.is_valid(): 
      form.save() #***This is where it happens*** 
      return HttpResponseRedirect('/') 
    else: 
     form = TreatmentForm(instance=Treatment.objects.get(id=treatment_id)) 

    return render_to_response('new_treatment.html', 
         {"form"    : form, 
         "customer_name"  : customer, 
         }, 
         RequestContext(request)) 

Kann jemand dieses seltsame Verhalten erklären?

class TreatmentForm(forms.ModelForm): 
    class Meta: 
     model = Treatment 
     fields = "__all__" 

    BOOL_CHOICES = (
     (True, 'has'), 
     (False, 'none') 
    ) 

    customer = forms.ModelChoiceField(queryset=Customer.objects.all(), widget=forms.RadioSelect(renderer=HorizontalRadioRenderer), required=False) 

    # Looking inspections 
    skin_hue_finding = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinHue.objects.all(), initial=0) 
    skin_hue_area = forms.CharField(max_length=200, required=False) 
    skin_hue_comments = forms.CharField(max_length=200, required=False) 
    skin_color_finding = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinColor.objects.all(), initial=0) 
    skin_color_area = forms.CharField(max_length=200, required=False) 
    skin_color_comments = forms.CharField(max_length=200, required=False) 
    pores_finding = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=Pores.objects.all(), initial=0) 
    pores_area = forms.ModelMultipleChoiceField(queryset=GlobalArea.objects.all(), widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer), required=False) 
    pores_comments = forms.CharField(max_length=200, required=False) 
    comdones_finding = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES)) 
    comdones_area = forms.ModelMultipleChoiceField(queryset=GlobalArea.objects.all(), widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer), required=False) 
    comdones_comments = forms.CharField(max_length=200, required=False) 
    wrinkles_finding = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    wrinkles_area = forms.ModelMultipleChoiceField(queryset=WrinklesArea.objects.all(), widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer), required=False) 
    wrinkles_mimics = forms.BooleanField(required=False) 
    wrinkles_age = forms.BooleanField(required=False) 
    wrinkles_comments = forms.CharField(max_length=200, required=False) 

    # Touching 
    muscle_tonus = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=MuscleTonus.objects.all(), initial=0) 
    skin_torgor = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinTorgor.objects.all(), initial=0) 
    skin_thinkness = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinThickness.objects.all(), initial=0) 
    skin_touch = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinTouch.objects.all(), initial=0) 

    # Skin Problems 
    papules = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    papules_area = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinProblemAreas.objects.all(), required=False, initial=0) 
    papules_comments = forms.CharField(max_length=200, required=False) 

    postules = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    postules_area = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinProblemAreas.objects.all(), required=False, initial=0) 
    postules_comments = forms.CharField(max_length=200, required=False) 

    scars = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    scars_area = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinProblemAreas.objects.all(), required=False, initial=0) 
    scars_comments = forms.CharField(max_length=200, required=False) 

    malium = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    malium_area = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=MaliumAreas.objects.all(), required=False) 
    malium_comments = forms.CharField(max_length=200, required=False) 

    pigmentation = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    pigmentation_area = forms.CharField(max_length=200, required=False) 
    pigmentation_comments = forms.CharField(max_length=200, required=False) 

    nebuses = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    nebuses_area = forms.CharField(max_length=200, required=False) 
    nebuses_comments_color = forms.CharField(max_length=200, required=False) 
    nebuses_comments_hair = forms.CharField(max_length=200, required=False) 

    macules = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    macules_area = forms.CharField(max_length=200, required=False) 
    macules_comments = forms.CharField(max_length=200, required=False) 

    hypermia = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    hypermia_area = forms.CharField(max_length=200, required=False) 
    hypermia_comments = forms.CharField(max_length=200, required=False) 

    coproz = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    coproz_area = forms.CharField(max_length=200, required=False) 
    coproz_comments = forms.CharField(max_length=200, required=False) 

    hersotism = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    hersotism_area = forms.CharField(max_length=200, required=False) 
    hersotism_comments = forms.CharField(max_length=200, required=False) 

    other_problems = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    other_problems_area = forms.CharField(max_length=200, required=False) 
    other_problems_comments = forms.CharField(max_length=200, required=False) 

    skin_diagnosis = forms.ModelMultipleChoiceField(queryset=DiagnosisCategory.objects.all(), widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer), required=True) 
    diagnosis_comment = forms.CharField(widget=forms.TextInput(attrs={'size':55}), max_length=200, required=False) 

    treatment_purpose = forms.CharField(widget=forms.TextInput(attrs={'size':55}), max_length=200) 
    customer_guidance = forms.CharField(widget=forms.Textarea(), max_length=200, required=False) 
    customer_recommendations = forms.CharField(widget=forms.Textarea(), max_length=200, required=False) 

    next_treatment_date = forms.DateField(required=True, input_formats=["%d-%m-%Y"], widget=forms.DateInput(format='%d-%m-%Y')) 
    next_treatment_comments = forms.CharField(widget=forms.Textarea(), max_length=200, required=True) 

    def __init__(self, *args, **kwargs): 
     super(TreatmentForm, self).__init__(*args, **kwargs) 
     self.fields["next_treatment_date"].widget.attrs["class"] = "datepicker" 

    def clean(self): 
     cleaned_data = super(TreatmentForm, self).clean() 
     validation_dict = {} 
     data = self.cleaned_data 

     if data.get("comdones_finding") == True and len(data.get("comdones_area")) == 0: 
      validation_dict["comdones_area"] = ["This field is required",] 

     # Check Boolean fields 
     if data.get("comdones_finding") is None: 
      validation_dict["comdones_finding"] = ["This field is required",] 
     if data.get("wrinkles_finding") is None: 
      validation_dict["wrinkles_finding"] = ["This field is required",] 
     if data.get("papules") is None: 
      validation_dict["papules"] = ["This field is required",] 
     if data.get("postules") is None: 
      validation_dict["postules"] = ["This field is required",] 
     if data.get("scars") is None: 
      validation_dict["scars"] = ["This field is required",] 
     if data.get("malium") is None: 
      validation_dict["malium"] = ["This field is required",] 
     if data.get("pigmentation") is None: 
      validation_dict["pigmentation"] = ["This field is required",] 
     if data.get("nebuses") is None: 
      validation_dict["nebuses"] = ["This field is required",] 
     if data.get("macules") is None: 
      validation_dict["macules"] = ["This field is required",] 
     if data.get("hypermia") is None: 
      validation_dict["hypermia"] = ["This field is required",] 
     if data.get("coproz") is None: 
      validation_dict["coproz"] = ["This field is required",] 
     if data.get("hersotism") is None: 
      validation_dict["hersotism"] = ["This field is required",] 
     if data.get("other_problems") is None: 
      validation_dict["other_problems"] = ["This field is required",] 

     if validation_dict: 
      raise forms.ValidationError(validation_dict)  

     return data 
+4

Bitte zeigen Sie die 'TreatmentForm' – Alasdair

+0

TreatmentForm wurde hinzugefügt –

+0

Ist der Kunde definitiv ausgewählt, wenn Sie das Formular absenden? Sie haben 'required = False', was bedeutet, dass es in Ordnung ist, den' customer' auf 'None' zu ​​stellen. Erhalten Sie das Problem weiterhin, wenn Sie das 'customer = forms.ModelChoiceField()' aus dem Formular entfernen und Django es automatisch rendern lassen? – Alasdair

Antwort

0

Meine Vermutung ist, dass Sie beim Posten des Formulars keinen Wert für den Kunden senden. Leer ist ein gültiger Wert, da Sie required=False haben. Daher setzt Django den Kunden auf None, wenn das Formular gespeichert wird.

Wenn Sie nicht möchten, dass das Feld customer bearbeitbar ist, sollten Sie es nicht in das Formular einschließen. Sie könnten dies mit exclude tun.

class TreatmentForm(forms.ModelForm): 
    class Meta: 
     model = Treatment 
     exclude = ['customer'] 

Die Verwendung von exclude kann leicht gefährlich sein. Es besteht die Gefahr, dass Sie dem Modell zukünftig ein privates Feld hinzufügen, und es wird automatisch zum Formular hinzugefügt, weil Sie vergessen haben, es zu exclude hinzuzufügen. Sie könnten stattdessen fields einstellen und customer herauslassen.

class TreatmentForm(forms.ModelForm): 
    class Meta: 
     model = Treatment 
     fields = ['skin_hue_finding', 'skin_hue_area', ... <all other fields>] 

Allerdings möchten Sie das in diesem Fall nicht tun, weil Sie viele viele Felder haben.

+0

Danke, aber das hat mein Problem teilweise gelöst, Es behoben das Problem, wenn ich eine bestehende Behandlung bearbeiten wollte (Instanz einer Behandlung ist bereits vorhanden), aber nicht, wenn ich eine neue Behandlung hinzufügen möchte. Gibt es eine Möglichkeit, ein bedingtes Ausschlussfeld zu setzen, wenn eine Instanz bereits existiert? –

+0

Das klingt nach einem anderen Problem, also wäre es besser, eine neue Frage zu stellen. Anstatt eine Bedingung zu setzen, denke ich, dass es besser wäre, zwei getrennte Formulare mit unterschiedlichen Werten für "fields" oder "excludes" zu haben. Um Doppelungen zu vermeiden, könnte ein Formular das andere erben oder beide könnten von einer Basisklasse erben. – Alasdair