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
Bitte zeigen Sie die 'TreatmentForm' – Alasdair
TreatmentForm wurde hinzugefügt –
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